![](/img/trans.png)
[英]Hibernate org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
[英]org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role
我有一个名为category的表,它有父类别字段。 我正在使用该字段来获取子类别。 我已经检查了类似问题的答案,建议是(fetch = FetchType.EAGER)。 但是我想把它加载为LAZY因为它是循环依赖。 (再次指向同一张桌子)。
@Entity
@Table(name = "CATEGORY")
public class Category implements Serializable {
@Id
@Column(name = "ID")
@GeneratedValue
private Integer id;
@Column(name = "CATEGORY_NAME", nullable = false, length = 40)
private String name;
@Column(name = "DESCRIPTION", nullable = false, length = 255)
private String description;
@Column(name = "DATE_CREATED", nullable = false)
private Date dateCreated;
@Column(name = "UUID", nullable = false, length = 40)
private String uuid;
@ManyToOne
@JoinColumn(name = "PARENT_CATEGORY_ID")
private Category parentCategory;
@OneToMany(mappedBy = "parentCategory")
private Collection<Category> subCategories = new LinkedHashSet<Category>();
}
错误是:
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.hemanths.expense.manager.api.hibernate.entity.Category.subCategories, could not initialize proxy - no Session
at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:566)
at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:186)
at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:545)
at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:124)
at org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:266)
有人可以帮我找到解决方案吗?
如果要获取注释为延迟加载的对象集合,并且您不希望将加载机制转换为eager,则必须在获取父级的同一session
或transaction
中获取集合只通过调用集合的size()
方法来对象,例如,如果你有这样的服务方法:
public Category getCategortById(int id) {
Category category = categoryDao.getCategortById(id);
category.getSubCategories().size(); // Hibernate will fetch the collection once you call the size()
}
另外,如果你想要一个更干净的方法,你可以使用Hibernate.initalize()
方法来初始化任何延迟加载对象或集合,所以它可能是这样的
public Category getCategortById(int id) {
Category category = categoryDao.getCategortById(id);
Hibernate.initialize(category.getSubCategories());
}
查看堆栈跟踪,看起来这是一个会话管理问题。 尝试查看您打开会话的位置以及您正在使用的SessionContext?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.