m3t*_*man 5 java spring ejb jpa transactions
假设我们有以下代码:
@Entity
public class User {
@Id
private String name;
@OneToOne(cascade = CascadeType.ALL)
private Address address;
//getters and setters
}
@Entity
public class Address {
@Id
private int id;
private String street;
//getters and setters
}
@Stateless
//@Service
public class UserLogicClass {
@PersistenceContext
//@Autowired
private EntityManager entityManager;
public void logicOnUser(User user) {
if(logicOnAddress(user.getAddress()) {
otherLogicOnUser(user);
}
}
public boolean logicOnAddress(Address address) {
//
entityManager.find(address);//address becomes managed
//
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
//@Transactional(propagation = Propagation.REQUIRES_NEW)
public void otherLogicOnUser
//
entityManager.find(user);/*without annotation, user is not managed and address is managed, but with the transaction annotation is the address still managed?*/
//
}
}
Run Code Online (Sandbox Code Playgroud)
问题依赖于最后一种方法的评论; 我很好奇在Spring案例和EJB案例中都会发生什么.假设Spring配置了JTA事务,并且从此类调用的任何方法都将启动新事务,就像在EJB中一样.
这更像是JPA的一个问题.除非您将其扩展,否则entityManager不会传播到新事务:
@PersistenceContext(type = PersistenceContextType.EXTENDED)
//@Autowired
private EntityManager entityManager;
Run Code Online (Sandbox Code Playgroud)
引用JPA 2.0规范:
容器管理的持久性上下文可以定义为具有作用于单个事务的生存期或跨越多个事务的扩展生命周期,具体取决于创建其实体管理器时指定的PersistenceContextType.此规范将持久性上下文分别称为事务范围的持久性上下文和扩展的持久性上下文.
| 归档时间: |
|
| 查看次数: |
2548 次 |
| 最近记录: |