首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate3 -> Hibernate 4和问题(延迟.)

Hibernate3 -> Hibernate 4和问题(延迟.)
EN

Stack Overflow用户
提问于 2014-02-06 14:39:41
回答 3查看 770关注 0票数 0

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

这个(复杂的)应用程序只在我们需要的时候才使用延迟加载和获取对象。

代码语言:javascript
复制
@Entity
@Table(name = "CLIENTS")
public class Clients  {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "INFOIDT", insertable = true, updatable = false)
private Information info;
//...
}

当我在使用该产品之前需要更多地了解它时:

代码语言:javascript
复制
cli.getInfo();

注意,在我的persistence.xml中,我还将属性hibernate.cache.provider_class设置为第二级缓存的org.hibernate.cache.EhCacheProvider。

问题: --用Hibernate4迁移现有代码的简单方法是什么?(上面给出的类是一个假示例,用来说明使用延迟加载的许多情况)谢谢。

应要求,请参见下面的“我的DAO”:

代码语言:javascript
复制
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;
    }

    //...

    }

/

代码语言:javascript
复制
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));
    }

    //...

    }
EN

回答 3

Stack Overflow用户

发布于 2014-02-06 14:55:07

如果要使用LazyLoading,则需要在调用.getInfo()时打开并连接会话。如果尝试获取实体,但会话已断开或关闭,则会发生org.hibernate.LazyInitializationException。我想你在会议处理上有问题。与实体无关。

票数 0
EN

Stack Overflow用户

发布于 2014-02-14 13:34:02

如果SessionFactory是在Spring文件中配置的,我们可以使用OpenSessionInViewFilter来保持会话打开。

代码语言:javascript
复制
<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>

不幸的是,我的应用程序不是这样配置的.

票数 0
EN

Stack Overflow用户

发布于 2014-02-18 15:24:57

Interesting...but还是帮不了05.html

但我发现了一些东西:

1)Hibernate 3.2.1GA和Spring2.0--我曾经把一个有懒包的人放在一个组里,当我想从这个组的任何人的袋子里拿一些铅笔的时候,我就能得到它。

2)Hibernate 4.2.8 et Spring3.2.5.如果我在接人后不明确地要求知道袋子的内容,在把它放入组之前,我会有一个懒惰的例外。

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

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

https://stackoverflow.com/questions/21605881

复制
相关文章

相似问题

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