Spring HibernateDaoSupport:延迟加载问题?

时间:2010-02-10 08:49:37

标签: java hibernate spring

问候, 在我的域模型中,

'家庭'有许多'SubFamily' 'SubFamily'有很多'Locus's

和懒惰加载的关系是双向的。

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

在下面的片段中,我已经使用DAO方法来检索轨迹。

在我的网络应用程序中(基于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;
                    }
                });
    }

1 个答案:

答案 0 :(得分:4)

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