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