のは、我々は次のコードがあるとしましょう:新しいトランザクションは、以前のすべてのエンティティをデタッチしますか?
@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?*/
//
}
}
質問が最後のメソッドからのコメントに依存しています。私は、Springの場合とEJBの場合の両方で何が起こっているのかを調べています。 SpringがJTAトランザクションで構成され、このクラスから呼び出されたすべてのメソッドがEJBと同じように新しいトランザクションを開始すると仮定します。
だから、タイプが拡張に設定されていない限り、そのメソッドの内部で、新しいエンティティマネージャは、任意の管理対象エンティティを持たない、作成されましたか? – m3th0dman
はい、正確です。 'otherLogicOnUser'メソッドでは、新しいトランザクションが作成され、永続コンテキストを拡張させない限り、永続コンテキストを伝播してはいけません。 – dcernahoschi
拡張EntityManagerの使用はステートフルEJBで使用するように設計されており、スレッドセーフではなく、トランザクションスコープのEntityManagerを使用するメソッドが同じトランザクション内の拡張EntityManagerを使用するメソッドを呼び出すと、永続コンテキストの衝突が発生する可能性があります。 – German