2017-06-21 23 views
-1

我正在使用模型文件,即Document.java和Document.hbm.xml中的jar文件。获取延迟初始化异常 - 访问模型对象属性时无会话

该文件类有一个对象:

class Document{ 

private Signature signature; 

// other fields 
// getter setters 

} 

与HBM映射如下:

<many-to-one name="signature" column="SIGNATURE_ID" class="com.model.Signature"/> 

现在,当我访问从罐子这些文件,所以我不想改变他们。

我取出Document对象如下:

Query qry = getSessionFactory().getCurrentSession().createQuery("from 
Document where id = :id"); 
qry.setParameter("id" , id); 
return (Document)qry.list().get(0); 

但现在当我拿出一个签名对象通过下面的代码:

我有一个实用工具类Utils.java所以我访问它为:

Utils utils = new Utils(); 

utils.getSignatures(document); 

这getSignatures的Utils类内的方法是

public Signatures getSignatures (Document document){ 

Signature sign = document.getSignature(); 

// working on sign object 

return sign; 
} 

所以现在在上面的代码中当过我做document.getSignature()我收到以下错误:

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

+0

请在出现异常的地方添加一段代码。你是否正在访问交易中的那个对象? – ledniov

+0

先生,我已经更新了这个问题 – Tarun

回答

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); 

我不知道休眠(或其他JPA实现)的版本使用的是这样我已经提供了可以改变的代码。

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的信息。