首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate延迟加载的集合和PropertyChangeSupport

Hibernate延迟加载的集合和PropertyChangeSupport
EN

Stack Overflow用户
提问于 2011-09-09 16:24:25
回答 2查看 2.4K关注 0票数 3

我有一个延迟初始化集合的实体,我还将PropertyChangeSupport添加到该实体类中。下面是设置者的样子:

代码语言:javascript
复制
public void setAskPrices(Set<AskPrice> askPrices) {
    propertyChangeSupport.firePropertyChange(ASKPRICES_PROPERTY, this.askPrices,
            this.askPrices = askPrices);
}

在代码的另一点上,我构建了一个条件查询,我希望它能够急切地获取这个集合:

代码语言:javascript
复制
List<PriceRequest> pr = session.createCriteria(PriceRequest.class)
                        .setFetchMode("askPrices", FetchMode.JOIN)
                        .add(Restrictions.ilike("reqNum", "%" + reqNum + "%")).list();

当我运行上面的查询时,我在Hibernate中得到了一个异常:

代码语言:javascript
复制
Caused by: org.hibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:383)
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationExceptionIfNotConnected(AbstractPersistentCollection.java:375)
at org.hibernate.collection.AbstractPersistentCollection.readSize(AbstractPersistentCollection.java:122)
at org.hibernate.collection.PersistentSet.size(PersistentSet.java:162)
at java.util.AbstractSet.equals(AbstractSet.java:75)
at java.beans.PropertyChangeSupport.firePropertyChange(PropertyChangeSupport.java:273)
at com.frc_agencies.model.persistent.PriceRequest.setAskPrices(PriceRequest.java:160)

在深入研究之后,我发现firePropertyChange()函数调用了oldValu.equals(newValue)。在我的例子中,newValue是新的持久性集。等于()函数在某个点调用新集合上的size()函数,然后调用org.hibernate.collection.AbstractPersistentCollection.readSize(),,如下所示:

代码语言:javascript
复制
protected boolean readSize() {
    if (!initialized) {
        if ( cachedSize!=-1 && !hasQueuedOperations() ) {
            return true;
        }
        else {
            throwLazyInitializationExceptionIfNotConnected();
            CollectionEntry entry = session.getPersistenceContext().getCollectionEntry(this);
            CollectionPersister persister = entry.getLoadedPersister();
            if ( persister.isExtraLazy() ) {
                if ( hasQueuedOperations() ) {
                    session.flush();
                }
                cachedSize = persister.getSize( entry.getLoadedKey(), session );
                return true;
            }
        }
    }
    read();
    return false;
}

异常将在throwLazyInitializationExceptionIfNotConnected().引发。它调用以下方法:

代码语言:javascript
复制
/**
 * Is the collection currently connected to an open session?
 */
private final boolean isConnectedToSession() {
    return session!=null && 
            session.isOpen() &&
            session.getPersistenceContext().containsCollection(this);
}

它在session.getPersistenceContext().containsCollection(this);上返回false,因此由于某种原因,此时持久性集合不是当前会话的一部分。

我决定做一个实验。我删除了对条件查询的setFetchMode()调用,在查询调用返回后,我调用:

代码语言:javascript
复制
Hibernate.initialize(pr.getAskPrices());

而且这似乎很好!

但是我不想一直打电话给Hibernate.initialize()。有人能建议我如何使用我最初的setFetchMode()调用来完成这项工作吗?

谢谢。

编辑:发布相关映射

代码语言:javascript
复制
<set name="askPrices" table="ASK_PRICE" inverse="true" lazy="true" fetch="select" cascade="all-delete-orphan">
    <meta attribute="bound">ASKPRICES_PROPERTY</meta>
    <key on-delete="cascade">
        <column name="REQ_ID" not-null="true" />
    </key>
    <one-to-many class="AskPrice" />
</set>
EN

回答 2

Stack Overflow用户

发布于 2013-10-10 19:03:32

对我起作用的是立即将套装变成另一种类型的收藏:

代码语言:javascript
复制
    List listOfObjects =  new ArrayList(aMethod.getASetOfObjects());

我们被困在使用一个旧版本的Hibernate。所以我的猜测是,Hibernate代码中有一个错误。通过立即构造另一个java Collection,它将对象复制到(非易失性)物理内存,而不是hibernate缓存。

所以最初的问题是:

代码语言:javascript
复制
    List this.askPrices = new ArrayList(askPrices)

希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2011-09-21 03:33:38

当您设置this.askprice = askprice时,您使this.askprice不再持久化,因此下一条带有会话的语句将抛出惰性异常。您可以在Xml映射中将懒惰更改为false (lazy="false"),这是我正在使用或可以尝试使用Spring和Hibernatetemplate的错误实践,这可能解决问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7364671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档