【问题标题】:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of roleorg.hibernate.LazyInitializationException:未能延迟初始化角色集合
【发布时间】:2015-05-03 14:32:54
【问题描述】:

我有一个名为 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)

谁能帮我找到解决办法?

【问题讨论】:

    标签: java hibernate lazy-loading hibernate-mapping


    【解决方案1】:

    查看您的堆栈跟踪,看起来这是一个会话管理问题。尝试查看您在哪里打开会话,以及您使用的是什么 SessionContext?

    【讨论】:

      【解决方案2】:

      如果你想获取一个被注释为延迟加载的对象集合,并且你不想将加载机制转换为渴望,那么你将不得不在相同的 session 或 @987654324 中获取集合@ 表示您仅通过为您的集合调用 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());
      }
      

      您可以查看更多关于初始化集合here

      【讨论】:

      • 感谢您的回复。如果我说 Hibernate.initialize(category.getSubCategories());它不会延迟加载。并且因为它是相互依赖的,所以 parentCategory 将具有 subCategories 并且每个子类别将再次具有 parentCategory。它无限地继续。
      • 抱歉,现在是这样吗?
      • 是的。这就是为什么我想懒惰地加载
      • 我认为你误解了一些东西,Eager 加载是如果你刚刚从数据库中获取对象,那么它的所有子对象都将被获取,lazy 加载是在另一个hand 意味着你需要在获取父级后触发子级来获取它们,Hibernate.initialize() 是这里的触发器。正如我所说的它应该发生在事务/会话中,请阅读更多关于eagerlazy在此处加载docs.jboss.org/hibernate/orm/3.3/reference/en/html/…
      猜你喜欢
      • 2013-12-08
      • 2017-08-04
      • 1970-01-01
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 2019-08-06
      • 2017-08-16
      • 1970-01-01
      相关资源
      最近更新 更多