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

时间:2017-06-21 11:44:34

标签: 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对象,如下所示:

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:无法初始化代理 - 没有会话

2 个答案:

答案 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的更多信息。