在hibernatetemplate上调用load方法会抛出LazyInitializationException

时间:2013-12-22 11:40:49

标签: spring hibernate

我在hibernatetemplate上调用load方法如下。

Emp emp = (Emp) hibernateTemplate.load(Emp.class, 7369);

Emp.java

import java.util.Date;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import javax.persistence.Id;

@Entity
@Table(name = "emp")
public class Emp implements java.io.Serializable {

    @Id
    @Column(name = "empno")
    private Integer empno;

    @Column(name = "ename")
    private String ename;

    @Column(name = "job")
    private String job;

    @Column(name = "mgr")
    private Double mgr;

    @Column(name = "hiredate")
    private Date hiredate;

    @Column(name = "sal")
    private Double sal;

    @Column(name = "comm")
    private Double comm;

    @Column(name = "deptno")
    private Integer deptno;

}

它抛出异常如下:

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

知道它为什么抛出上述异常。如果我使用get方法代替加载,它可以工作。 请分享你对那里错误的想法。

提前致谢。

1 个答案:

答案 0 :(得分:0)

执行load时,它将创建代理对象(它不会将select语句激活到数据库并获取数据)。在您第一次尝试访问对象的某些属性之后,代理将尝试从DB中进行选择。但这只能在hibernate事务中发生。尝试使用get代替load或使用会话中的代理对象。

如果您使用Spring来管理交易,请确保代理的使用在@Transactional方法中。 例如。 这将有效

   @Transactional
     public void getEmp(long id){
        Emp emp = (Emp) hibernateTemplate.load(Emp.class, 7369);//the proxy will be created
        emp.getSomeProperty();//the select statement will be executed
     }

这将抛出异常:

 @Transactional
     public Emp getEmp(long id){
        Emp emp = (Emp) hibernateTemplate.load(Emp.class, 7369);//the proxy will be created
        return emp;
     }
...
public void someNonTransactionalMethod(){
   Emp emp = empServce.getEmp(1);
   emp.getSomeProperty();//hibernate will try to select, but it's not in transaction
}

你可以使someNonTransactionalMethod事务处理,但要注意这需要来自数据库的addl连接。