【问题标题】:Hibernate3 --> Hibernate 4 and issues (Lazy...)Hibernate3 --> Hibernate 4 和问题(懒惰...)
【发布时间】:2014-03-03 13:46:41
【问题描述】:

我正在尝试更新我的项目的库(从 Hibernate 3.2.1 GA 到 Hibernate 4.2.8)

这个(复杂的)应用程序使用 LAZY 加载并仅在我们需要时才获取对象。 -->它现在的工作方式似乎有所不同,因为我得到了一些 org.hibernate.LazyInitializationException: could not initialize proxy - no Session

@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));
    }

    //...

    }

【问题讨论】:

    标签: sql spring hibernate hibernate-4.x hibernate3


    【解决方案1】:

    如果要使用 LazyLoading,则需要在调用 .getInfo() 时打开并连接会话。如果您尝试获取实体但会话断开或关闭,则会发生 org.hibernate.LazyInitializationException。 我认为您在会话处理方面存在问题。与实体无关。

    【讨论】:

    • 你到底是什么意思?代码与以前相同,我没有明确看到项目中对“会话”的任何引用。以前会话应该保持打开状态,因为 cli.getInfo() 给了我数据。我需要改变什么?
    • 一切都由 Entitymanager 处理:在我的 DAO 中,我只有:@PersistenceContext(unitName = "myApp.hibernate") private EntityManager em; -->我没有明确地打开或关闭会话。
    • 你能发布你的 DAO 吗?
    • 我刚刚发布了我的 DAO
    • 我阅读了很多关于处理 Spring 事务/会话的方法的内容,但没有一个与我的应用程序的编写方式相匹配。真不知道新版本的Spring/Hibernate怎么办……
    【解决方案2】:

    如果 SessionFactory 配置在 Spring 上下文文件中,我们可以使用 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>
    

    很遗憾,我的应用程序没有这样配置...

    【讨论】:

      【解决方案3】:

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

      但我发现了一些东西:

      1)Hibernate 3.2.1 GA 和 Spring 2.0 我曾经把一个有 LAZY 包的人放在一个小组中,当我想从小组中任何一个人的包里拿出铅笔时,我都能拿到。

      2)Hibernate 4.2.8 和 Spring 3.2.5。 如果我在拿到 Person 之后并在放入 group 之前没有明确要求知道 bag 的内容,就会出现惰性异常。

      如果有人能解释我为什么......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-10-07
        • 2010-11-25
        • 2018-03-31
        • 1970-01-01
        • 2012-06-02
        • 2015-09-06
        • 1970-01-01
        相关资源
        最近更新 更多