【问题标题】:Hibernate threw org.hibernate.LazyInitializationExceptionHibernate 抛出 org.hibernate.LazyInitializationException
【发布时间】:2016-02-01 13:03:40
【问题描述】:

在尝试使用休眠从数据库中使用购买对象填充 javaFX 表视图之后。为了澄清一点,我有与多对多关系相关的购买和产品实体,我已应用此方法 [我自己的代码] (Hibernate many to many relationship with extras columns) 来映射此关系。 我收到此错误:

Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: model.Purchase.lineItems, could not initialize proxy - no Session
    at org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:567)
    at org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:205)
    at org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:546)
    at org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:133)
    at org.hibernate.collection.internal.PersistentSet.iterator(PersistentSet.java:163)
    at java.util.AbstractCollection.addAll(AbstractCollection.java:343)
    at javafx.collections.ModifiableObservableListBase.addAll(ModifiableObservableListBase.java:99)
    at controller.purchase.PurchaseController.setPurchaseHeader(PurchaseController.java:254)
    at controller.purchase.PurchaseController.btnEditClicked(PurchaseController.java:244)

这是我从数据库获得所有购买的代码: 请注意,我用 thoes 元素填充了一个 tableView,并且对于每个购买都有 LineItems。

 public ObservableList<Purchase> findAll() {
        try {
            if (!session.isOpen())
                session = DatabaseUtil.getSessionFactory().openSession();
            session.beginTransaction();
            Criteria c = session.createCriteria(Purchase.class);
            c.setFetchMode("lineItems", FetchMode.JOIN);
            Query query = session.createQuery("  from Purchase ");
            ObservableList<Purchase> list = FXCollections.observableArrayList(query.list());
            session.getTransaction().commit();
            session.close();
            return list;
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

【问题讨论】:

  • 能否向我们展示您的采购和产品 POJO?
  • 我刚刚添加了上一个问题的链接,上面的女巫包含了我所有的 POJOS
  • 在尝试获取惰性部分中的对象之前是否要关闭会话?
  • 尝试将@OneToMany(mappedBy = "pk.purchase", cascade = CascadeType.ALL) 更改为@OneToMany(mappedBy = "pk.purchase", cascade = CascadeType.ALL,fetch = FetchType.EAGER )
  • 我得到另一个异常:org.hibernate.exception.SQLGrammarException: could not extract ResultSet at

标签: java hibernate postgresql hibernate-mapping


【解决方案1】:

发生这种情况是因为您试图在 Session 上下文之外访问这些 lineItems 集合,而这些 lineItems 对象不是由您用于获取 Purchase(s) 的实际查询带来的

在您为购买项目进行选择的休眠代码中的某处,您应该为这些 lineItems 添加获取连接模式

喜欢:

Criteria c = sessionFactory.getCurrentSession().createCriteria(Purchase.class);
c.setFetchMode("lineItems", FetchMode.JOIN);

编辑

阅读您的代码后,我建议:

public List<Purchase> findAll() {
   try {
        if (!session.isOpen())
            session = DatabaseUtil.getSessionFactory().openSession();
        session.beginTransaction();
        Criteria c = session.createCriteria(Purchase.class);
        c.setFetchMode("lineItems", FetchMode.JOIN);
        List<Purchase> list = (List<Purchase>)c.list();

        session.close();
        return list;
    } catch (Exception e) {
        e.printStackTrace();
        return null;
    }
}

然后将您的 List 包装到此调用调用之外的另一个 ObservableList 中

【讨论】:

  • 添加此行后:在我的 purchaseDAO 中出现此错误:rg.hibernate.exception.SQLGrammarException: could not extract ResultSet at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java: 106) 在 org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:109) 处的 org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)
  • 请将您的相关查询代码粘贴到问题中
  • ObservableList&lt;Purchase&gt; list = FXCollections.observableArrayList(c.list());替换Query query = session.createQuery(" from Purchase "); ObservableList&lt;Purchase&gt; list = FXCollections.observableArrayList(query.list());
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 2012-10-16
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-25
相关资源
最近更新 更多