我们在这里就 JPA EntityManager 的持久性进行了一些讨论。
假设以下代码:
MyObject obj = new MyObject();
obj.setName("Lalala");
em.persist(obj);
// This is just an example to show that I intend on
// using the obj instance after persisting.
em.flush();
System.out.println(obj.getId());
现在我对持久化的理解是它负责持久化 obj 但不会使 obj 被管理。我的同事声称 obj 现在已成为托管对象,这也是 EntityManager 的 JavaDoc 所声称的。
我现在的问题是:这怎么可能?在java中,我想不出任何逻辑
Vehicle car = new Car();
try {
car.fillInFuel(Fuel.TRUCK_DISEL);
Asert.fail("filling in truck fuel into a car, should theow an exception.");
} catch(BadFuleException pfe) {
// Handle this.
}
// Now call some sort of magic, converting my car into a truck.
// (An unmanaged entity into a managed entity)
makeTruck(car);
// treat the car as a truck from here.
try {
car.fillInFuel(Fuel.TRUCK_DISEL);
} catch(BadFuleException pfe) {
Asert.fail("filling in truck fuel into a truck, should work.");
}
这可能是管理实体的方式不同。我习惯使用 EclipseLink,而我的同事正在使用 Hibernate。在 EclipseLink 中,对持久性的调用不会使我传入的实体实例持久化,它只是负责保存数据。如果我想继续处理托管实体,我必须改用合并。
if(!em.contains(obj)) {
obj = em.merge(obj);
} else {
em.persist(obj);
}
我知道在 EclipseLink 中,托管实体与非托管实体不同,因为更改跟踪是在实体中完成的,而在 Hibernate 中,似乎根本没有跟踪更改。
那么......谁是对的?EclipseLink 和 Hibernate 对 EntityManager 类的 Api-Docs 的解释是否完全不同?EclipseLink 之一是否正确?
克里斯