【发布时间】:2012-11-03 03:32:42
【问题描述】:
我试图观察下面的 JPA2 / Hibernate4 代理行为,
// 带有延迟加载的循环实体:
@Entity
public class Employee {
@Id@Generated
int id;
String name;
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
Employee boss;
public String toString() {
return id + "|" + name + "|" + boss;
}
//getters and setters ...
}
// 持久化实体:
// Outer entity:
Employee employee = new Employee();
employee.setName("engineer");
// Inner entity:
Employee boss = new Employee();
boss.setName("manager");
employee.setBoss(boss);
entityTransaction.begin();
entityManager.persist(employee);
entityTransaction.commit();
System.out.println(employee);
// 输出:
Hibernate: insert into Employee (id, boss_id, name) values (default, ?, ?)
Hibernate: insert into Employee (id, boss_id, name) values (default, ?, ?)
2|engineer|1|manager|null
// 加载外部实体:
String queryString = "select e from Employee e where e.id=" + employee.getId();
Query query = entityManager.createQuery(queryString);
Object loadedEmployee = query.getSingleResult();
System.out.println(loadedEmployee.getClass().getSimpleName());
// 输出:
Hibernate: select employee0_.id as id2_, employee0_.boss_id as boss3_2_, employee0_.name as name2_ from Employee employee0_ where employee0_.id=2 limit ?
Employee
令我惊讶的是,上面加载的外部实体仍然是普通的,但我希望它是由lazy loading 产生的Hibernate proxy。我可能在这里错过了一些东西,那么如何让它正确呢?非常感谢一个简单而具体的例子!
@EDIT
根据@kostja的回答,我修改了代码并在下面的SE模式下调试,既不能生成LazyInitializationException,也不能代理boss property。还有什么提示吗?
@EDIT 2
最后,我要确认@kostja 的回答无疑很棒。
我是在EE模式下测试的,所以下面观察到proxied boss property,
//LazyInitializationException抛出:
public Employee retrieve(int id) {
Employee employee = entityManager.find(Employee.class, id);
// access to the proxied boss property outside of persistence/transaction ctx
Employee boss = employee.getBoss();
System.out.println(boss instanceof HibernateProxy);
System.out.println(boss.getClass().getSimpleName());
return boss;
}
// 将Spring Tx 放置到位后绿灯:
@Transactional
public Employee retrieve(int id) ...
// 输出:
true
Employee_$$_javassist_0
另外,可以参考 Hibernate 文档中的20.1.4. Initializing collections and proxies。
【问题讨论】:
标签: hibernate jpa jpa-2.0 hibernate-4.x