我正在使用一个模型文件,即jar文件中的Document.java和Document.hbm.xml。
此文档类有一个对象:
class Document{
private Signature signature;
// other fields
// getter setters
}
使用hbm映射如下:
<many-to-one name="signature" column="SIGNATURE_ID" class="com.model.Signature"/>
现在我正在从jar访问这些文件,所以我不想更改它们。
我正在取出Document对象,如下所示:
Query qry = getSessionFactory().getCurrentSession().createQuery("from
Document where id = :id");
qry.setParameter("id" , id);
return (Document)qry.list().get(0);
但现在当我通过以下代码取出Signature对象时:
我有一个实用程序类Utils.java,所以我将其作为:
访问它Utils utils = new Utils();
utils.getSignatures(document);
并且Utils类中的这个getSignatures方法是
public Signatures getSignatures (Document document){
Signature sign = document.getSignature();
// working on sign object
return sign;
}
所以现在就像上面的代码一样,当我做document.getSignature()时,我收到以下错误:
org.hibernate.LazyInitializationException:无法初始化代理 - 没有会话
答案 0 :(得分:0)
当您有一个开放式会话时,您应该获得签名:
Document document = session.get(whatEverID);
Signature signature = document.getSignature();
或急切地获取您的签名,如:
<many-to-one name="signature" column="SIGNATURE_ID" class="com.model.Signature" fetch="eager"/>
或者加入获取您的签名,如:
Criteria criteria = createCriteria().setFetchMode("signature", FetchMode.JOIN);
我不知道您使用的是哪个版本的hibernate(或其他JPA实现),因此我提供的代码可能会有所不同。
答案 1 :(得分:0)
延迟加载需要一个事务。基本上,您使用Hibernate事务的典型工作流程应如下所示:
Session session = null;
Transaction tx = null;
try {
session = getSessionFactory().getCurrentSession();
tx = session.beginTransaction();
// doSomething(session);
tx.commit();
} catch(RuntimeException e) {
try {
tx.rollback();
} catch(RuntimeException rollbackException) {
log.error("Couldn’t roll back transaction", rollbackException);
}
throw e;
} finally {
if(session!=null) {
session.close();
}
}
另请阅读this post有关在Hibernate中提取类型的信息。
有关延迟加载参考this question的更多信息。