Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate/Spring:在@Transactional中加载惰性集合时出错_Java_Hibernate_Spring_Lazy Loading - Fatal编程技术网

Java Hibernate/Spring:在@Transactional中加载惰性集合时出错

Java Hibernate/Spring:在@Transactional中加载惰性集合时出错,java,hibernate,spring,lazy-loading,Java,Hibernate,Spring,Lazy Loading,我认为我理解懒惰/渴望加载,但显然我不理解: 我有一个标记为@Transactional的服务,但是当我尝试操作我得到的列表(访问它的对象)时,我得到了“org.hibernate.LazyInitializationException:未能延迟初始化角色集合:tld.myproduct.data.entities.CategoryType.translateableText,没有关闭任何会话或会话”。有什么建议可以解释为什么我不能访问我的under objects吗 更新:异常发生在“type

我认为我理解懒惰/渴望加载,但显然我不理解:

我有一个标记为@Transactional的服务,但是当我尝试操作我得到的列表(访问它的对象)时,我得到了“org.hibernate.LazyInitializationException:未能延迟初始化角色集合:tld.myproduct.data.entities.CategoryType.translateableText,没有关闭任何会话或会话”。有什么建议可以解释为什么我不能访问我的under objects吗

更新:异常发生在“type.getTranslatableText().size()行”

干杯

尼克

//服务
@服务(“类别类型服务”)
@事务性(“transactionManager”)
公共类CategoryTypeServiceImpl扩展AbstractCRUDServiceImpl实现CategoryTypeService{
@抑制警告(“未选中”)
@凌驾
公共列表getAll(){
List List=DAO.getSession().createCriteria(CategoryType.class).List();
对于(类别类型:列表)
键入.getTranslatableText().size();//访问TranslatableText以演示问题
退货清单;
}
}
//实体
@实体
@缓存(用法=缓存并发策略。只读)
@可配置(预构造=真)
公共类类别类型{
@身份证
@列(nullable=false)
私有整数id;
@列(长度=50,可空=true)
私有字符串描述;
@列(name=“translateableDescriptionId”,null=false)
私有整数translateableDescriptionID;
@OneToMany(fetch=FetchType.LAZY)
@JoinColumn(name=“Id”,referencedColumnName=“translateableDescriptionId”,insertable=false,updateable=false)
私有集可翻译文本;
/**接球手和接球手**/
}

以下是对该问题的一般性讨论。我建议你读这篇文章

简单地说,您有3种可能的解决方案:

1) 不要延迟加载集合(当然,如果不是关键性的,那么应该以某种方式测试性能):

@OneToMany(fetch=FetchType.EAGER)//您的DAO.getSession()方法是如何实现的?WaxWing:return((SessionFactory)SessionFactory.getCurrentSession();建议#1具有启发性,因为它会导致其他错误。Hibernate似乎对我在多少地方使用这个可翻译文本感到生气,所以我需要整理一下,这很可能就是这个奇怪错误背后的故事。所以建议#2可能涉及到延迟加载,因为它以前已经在其他地方加载过。不过,我不是建议3的忠实粉丝,因为在我看来,这首先会破坏使用JPA的大部分目的,或者我误解了你?
// The service
@Service("categoryTypeService")
@Transactional("transactionManager")
public class CategoryTypeServiceImpl extends AbstractCRUDServiceImpl<CategoryType, Integer> implements CategoryTypeService {

    @SuppressWarnings("unchecked")
    @Override
    public List<CategoryType> getAll() {
        List<CategoryType> list = DAO.getSession().createCriteria(CategoryType.class).list();

        for(CategoryType type : list)   
            type.getTranslatableText().size();  // Access TranslatableText to demonstrate problem

        return list;
    }

}


// The entity
@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
@Configurable(preConstruction=true)
public class CategoryType {

    @Id
    @Column(nullable = false)
    private Integer id;

    @Column(length = 50, nullable = true)
    private String description;

    @Column(name = "TranslatableDescriptionId", nullable = false)
    private Integer TranslatableDescriptionId;

    @OneToMany(fetch=FetchType.LAZY)
    @JoinColumn(name = "Id", referencedColumnName="TranslatableDescriptionId", insertable=false, updatable=false)
    private Set<TranslatableText> translatableText;

    /** getters and setters **/
}
@OneToMany(fetch=FetchType.EAGER)   //   <-- it's not lazy any more
@JoinColumn(name = "Id", referencedColumnName="TranslatableDescriptionId", insertable=false, updatable=false)
private Set<TranslatableText> translatableText;