【问题标题】:Spring HibernateDaoSupport : lazy-loading problem?Spring HibernateDaoSupport:延迟加载问题?
【发布时间】:2023-03-03 12:24:02
【问题描述】:

您好, 在我的领域模型中,

“家庭”有许多“子家庭” 'SubFamily' 有许多 'Locus's

关系是双向的,延迟加载。

即。 'Locus' 可以使用 alocus.getSubFamily() 在父 'SubFamily' 中访问;

在 sn-p 下面我给出了 DAO 方法来检索 Locus。

在我的网络应用程序中(基于 Wicket)

我从 DAO 获取轨迹,然后尝试将 SubFamily 获取为:

Locus alocus = dao.getLocusByLocusId(alocusid);
SubFamily asubfamily=alocus.getSubFamily();

但它会抛出错误:

org.hibernate.LazyInitializationException: 无法初始化代理 - 否 会议 在 org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:57) 在 org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:111) 在 org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer.invoke(CGLIBLazyInitializer.java:150) 在 com.bigg.nihonbare.common.domain.SubFamily$$EnhancerByCGLIB$$a0d68bed.getSubFamilyId(

有什么建议吗?

public Locus getLocusByLocusId(final String LocusId) {

        return (Locus) this.getHibernateTemplate().execute(
                new HibernateCallback() {
                    public Object doInHibernate(Session session) {
                        Criteria criteria = session.createCriteria(Locus.class);
                        criteria.add(Expression.eq("locusId", LocusId));
                        List result =criteria.list();
                        if (result!=null && result.size() > 0) {
                            return result.get(0);
                        }
                        return null;
                    }
                });
    }

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    很明显,在调用此方法时,Hibernate 会话未打开。您使用的是 Spring + Hibernate 还是仅使用 Hibernate?如果您使用的是 Spring,请尝试使用 Spring 在 web.xml 中提供的 OpenSessionInView 过滤器。过滤器类是 org.springframework.orm.hibernate3.support.OpenSessionInViewFilter。 否则,如果您不使用 spring,请提供有关会话何时何地打开和关闭的更多详细信息。

    【讨论】:

    • 我正在使用 SPring HibernateDAOSupport ,我很困惑..Hibernate Session 在没有 OSV 过滤器的情况下实际上在哪里关闭和打开?
    • 回调将使用“活动”休眠会话(如果存在)。如果不是,那么会话将在回调本身中创建、使用和关闭。如果您想在回调外部使用返回的对象进行休眠查询,那么您需要将对象与当时的活动会话重新关联。我建议尽可能采用更清洁且经过验证的 OSV 方式来做事。
    • Elister:当我尝试通过独立的 Java 应用程序访问 DAO 时,我遇到了同样的问题。需要做什么才能摆脱它?