我在hibernatetemplate上调用load方法如下。
Emp emp = (Emp) hibernateTemplate.load(Emp.class, 7369);
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方法代替加载,它可以工作。 请分享你对那里错误的想法。
提前致谢。
答案 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连接。