Hibernate抛出了org.hibernate.LazyInitializationException

问题描述 投票:0回答:1

尝试使用hibernate从数据库中使用Purchase Object填充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,并且每个Purchase都有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;
        }
    }
java hibernate postgresql hibernate-mapping
1个回答
0
投票

这是因为您尝试在Session上下文之外访问这些lineItems集合,并且这些lineItems对象不是您用于获取Purchase的实际查询所带来的

在你的某个地方休眠代码,为你的购买项目选择你应该为这些lineItems添加一个获取连接模式

喜欢 :

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

EDIT

阅读完代码后,我会建议:

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中

© www.soinside.com 2019 - 2024. All rights reserved.