Java 获取延迟初始化异常-访问模型对象属性时没有会话

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"/> 但现

我使用的是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"/>
但现在,当我通过以下代码取出签名对象时:

我有一个实用程序类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();
    }
}