Java 获取延迟初始化异常-访问模型对象属性时没有会话
我使用的是jar文件中的一个模型文件,即Document.java和Document.hbm.xml 此文档类有一个对象:Java 获取延迟初始化异常-访问模型对象属性时没有会话,java,hibernate,hibernate-mapping,session-management,Java,Hibernate,Hibernate Mapping,Session Management,我使用的是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"/> 但现
class Document{
private Signature signature;
// other fields
// getter setters
}
hbm映射如下所示:
<many-to-one name="signature" column="SIGNATURE_ID" class="com.model.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:无法初始化代理-无会话
您应该在打开会话时获得签名,如:
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实现),因此我提供的代码可能会有所不同。延迟加载需要一个事务。基本上,具有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();
}
}
还可以阅读有关在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();
}
}