6

次のコードがあるとします。

@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 と同様に、このクラスから呼び出されたメソッドが新しいトランザクションを開始するとします。

4

2 に答える 2

6

それはJPAの問題です。拡張しない限り、entityManager は新しいトランザクションに伝播されません。

@PersistenceContext(type = PersistenceContextType.EXTENDED)
//@Autowired
private EntityManager entityManager;

JPA 2.0 仕様からの引用:

コンテナ管理の永続コンテキストは、エンティティ マネージャの作成時に指定された PersistenceContextType に応じて、単一のトランザクションにスコープが設定された有効期間または複数のトランザクションにまたがる拡張有効期間のいずれかを持つように定義できます。この仕様では、トランザクション スコープの持続性コンテキストや拡張持続性コンテキストなどの持続性コンテキストをそれぞれ参照しています。

于 2013-04-27T06:45:15.987 に答える