Java Spring HibernateDaoSupport:延迟加载问题?
您好, 在我的领域模型中 “家族”有许多“亚家族” “亚家族”有许多“基因座” 并且关系是双向的,具有延迟加载 也就是说,“Locus”可以使用alocus.getSubFamily()访问父“SubFamily” 在下面的代码片段中,我给出了检索轨迹的DAO方法 在我的Web应用程序中(基于Wicket) 我从DAO中获得轨迹,然后尝试获得如下子家族:Java Spring HibernateDaoSupport:延迟加载问题?,java,hibernate,spring,Java,Hibernate,Spring,您好, 在我的领域模型中 “家族”有许多“亚家族” “亚家族”有许多“基因座” 并且关系是双向的,具有延迟加载 也就是说,“Locus”可以使用alocus.getSubFamily()访问父“SubFamily” 在下面的代码片段中,我给出了检索轨迹的DAO方法 在我的Web应用程序中(基于Wicket) 我从DAO中获得轨迹,然后尝试获得如下子家族: Locus alocus = dao.getLocusByLocusId(alocusid); SubFamily asubfamily=al
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$$enhancerbyglib$$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;
}
});
}
很明显,调用此方法时Hibernate会话未打开。您使用的是Spring+Hibernate还是仅使用Hibernate?如果您使用的是Spring,请尝试使用Spring在web.xml中提供的OpenSessionInView筛选器。筛选器类为org.springframework.orm.hibernate3.support.OpenSessionInViewFilter。
如果您没有使用spring,请提供有关会话打开和关闭的时间和地点的更多详细信息。很明显,调用此方法时Hibernate会话未打开。您是使用spring+Hibernate还是仅使用Hibernate?如果您使用spring,请尝试使用我们中spring提供的OpenSessionInView筛选器b、 过滤类是org.springframework.orm.hibernate3.support.OpenSessionInViewFilter。
如果不使用spring,请提供有关会话打开和关闭的时间和地点的更多详细信息。我使用的是spring Hibernate OSupport,我感到困惑。.在没有OSV筛选器的情况下,Hibernate会话在哪里关闭和打开?回调将使用“active”hibernate会话(如果存在)。如果没有,则会话将在回调本身中创建、使用和关闭。如果要使用回调外部的返回对象进行hibernate查询,则需要将对象与活动会话重新关联。我建议尽可能使用更干净、经验证的OSV方法。Elister:当我试图通过独立的java应用程序访问DAO时,我面临同样的问题。需要做些什么才能摆脱它?我使用的是SPring HibernateDAOSupport,我很困惑。没有OSV筛选器,Hibernate会话在哪里关闭和打开?回调将使用“active”hibernate会话(如果存在)。如果没有,则会话将在回调本身中创建、使用和关闭。如果要使用回调外部的返回对象进行hibernate查询,则需要将对象与活动会话重新关联。我建议尽可能使用更干净、经验证的OSV方法。Elister:当我试图通过独立的java应用程序访问DAO时,我面临着同样的问题。需要做些什么来摆脱它?