簡體   English   中英

Hibernate3-> Hibernate 4和問題(懶惰……)

[英]Hibernate3 --> Hibernate 4 and issues (Lazy…)

我正在嘗試更新項目的庫(從Hibernate 3.2.1 GA到Hibernate 4.2.8)

這個(復雜的)應用程序使用LAZY加載,並且僅在需要時才獲取該對象。 ->現在似乎工作方式有所不同,因為我得到了一些org.hibernate.LazyInitializationException :無法初始化代理-沒有會話

@Entity
@Table(name = "CLIENTS")
public class Clients  {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INFOIDT", insertable = true, updatable = false)
private Information info;
//...
}

當我需要在使用該產品之前進一步了解該產品時:

cli.getInfo();

請注意,在我的persistence.xml中,我還將hibernate.cache.provider_class屬性設置為org.hibernate.cache.EhCacheProvider,用於二級緩存。

問題:用Hibernate4遷移現有代碼的簡單方法是什么? (例如,上面給出的類是一個偽示例,以說明使用LAZY加載的許多情況)謝謝。

根據要求,請參閱下面的我的DAO:

public class MyAppJpaDAO extends GenericJpaDAO implements IMyAppDAO {
    protected static Log log = LogFactory.getLog(MyAppJpaDAO.class);

    // Entity Manager of the project
    @PersistenceContext(unitName = "MyApp.hibernate")
    private EntityManager em;

    public News readLastNews() {
        StringBuffer sql = new StringBuffer("");
        sql.append(" select object(n) ");
        sql.append(" from News n ");
        sql.append(" Where n.flagLastStatus = 'V' ");
        sql.append(" order by n.pk.date desc ");
        Query aQuery = em.createQuery(sql.toString());

        List<News> res = (List<News>) aQuery.getResultList();
        if (res != null && res.size() != 0) {
            return res.get(0);
        }
        return null;
    }

    //...

    }

/////////////

public class GenericJpaDAO implements IGenericDAO {

    protected static Log log = LogFactory.getLog(GenericJpaDAO.class);

    @PersistenceContext(unitName = "MyApp.hibernate")
    EntityManager em;

    public Object getReference(Class _class, Object _object) {
        return em.getReference(_class, _object);
    }

    public void createObject(Object object) {
        try {
            em.persist(object);
        } catch (LazyInitializationException lie) {
            em.merge(em.merge(object));
        }
    }

    public void deleteObject(Object object) {
        try {
            em.remove(object);
        } catch (Exception e) {
            em.remove(em.merge(object));
        }
    }

    public void updateObject(Object object) {
        em.merge(em.merge(object));
    }

    //...

    }

如果要使用LazyLoading,則需要在調用.getInfo()時打開和連接會話。 如果您嘗試獲取實體但會話已斷開或關閉,則會發生org.hibernate.LazyInitializationException。 我認為您在會話處理方面遇到問題。 與實體無關。

如果在Spring上下文文件中配置了SessionFactory,則可以使用OpenSessionInViewFilter保持會話打開。

<filter>
    <filter-name>Hibernate Session In View Filter</filter-name>
       <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Hibernate Session In View Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

不幸的是,我的應用程序沒有這樣配置...

有趣...但是仍然沒有幫助http://www.javacodegeeks.com/2012/07/four-solutions-to-lazyinitializationexc_05.html

但是我發現了一些東西:

1)Hibernate 3.2.1 GA和Spring 2.0我曾經將一個裝有LAZY包的人放在一個小組中,當我想從該小組任何人的書包中拿出鉛筆時,我就能夠得到它。

2)休眠4.2.8和春季3.2.5。 如果我在獲得Person之后並沒有將其放入小組之前不明確要求知道袋子的內容,我將有一個懶惰的例外。

如果有人能解釋我為什么...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM