我正在学习EJB / JPA,我想知道这个代码片段应该如何工作:
@Stateful
public class Sample {
@PersistenceContext(type=PersistenceContextType.EXTENDED,
synchronization=SynchronizationType.UNSYNCHRONIZED,
unitName="..")
EntityManager em;
public Employee get(int id){
retirm em.find(Employee.class , id);
}
// ...
}
它是一个有状态bean,因此默认情况下它应该包含在容器管理器事务中(REQUIRED)。
但另一方面,除非明确加入,否则不同步的经理不会加入交易。
那么,如果它没有加入tx,它如何从数据库中获取数据?是否可能包含脏/幻读等?
此片段来自“Pro JPA 2”。
答案 0 :(得分:2)
从JPA 2.1规范3.1.1开始:
find
方法(前提是它在没有锁定的情况下调用或使用LockModeType.NONE
调用) 并且不需要在事务中调用getReference
方法。如果是实体经理 如果正在使用事务范围的持久性上下文,则将分离生成的实体;如果 使用具有扩展持久性上下文的实体管理器,它们将被管理。