2016-09-02 9 views
0

は、次のEJBセッションBeanいるI:EJBで分離トランザクションを取得するにはどうすればよいですか?

@Entity 
public class Record implements Serializable{ 

    private static final long serialVersionUID = 1L; 

    @Id 
    private Long id; 

    public Long getId() { 
     return id; 
    } 

    public void setId(Long id) { 
     this.id = id; 
    } 

    @Override 
    public String toString() { 
     return "Record{" + "id=" + id + '}'; 
    } 

} 

私は、挿入のためのスタンドアロンのJavaアプリケーションでのリモートメソッドを呼び出しています3つの数字:

@Stateless 
public class FacadeBean implements FacadeBeanRemote { 
    @PersistenceContext(unitName = "ejercicio7PU") 
    private EntityManager em; 

    @Override 
    public void insertar(final long id) { 
     Record r = new Record(); 
     r.setId(id); 
     em.persist(r); 
    } 

    @Override 
    public void insertarTres(final long id1, final long id2, final long id3) { 
     Logger.getLogger(FacadeBean.class.getName()).log(Level.INFO, "Insertando registros"); 
     insertar(id1); 
     insertar(id2); 
     insertar(id3); 
    } 

} 

とレコードエンティティは以下のとおりです。

ejb.insertarTres(1l, 2l, 3l); 

ここで、次の番号を使用してリモートメソッドを再度呼び出すとします。

ejb.insertarTres(4l, 5l, 3l); 

番号4と5は、例外は私が

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

とinsertメソッドを設定しようとしましたが、それは私の

のために働いていない番号3

によって発生した場合であっても保存されます

+0

Whoopsは前のコメントに何かを追加するのを忘れていました。私はinsertarTres()を呼び出すときはどこでも別々に呼び出していました。 – Gimby

+3

[必要な\ _Newのトランザクションをコミットしないのはなぜですか?](http://stackoverflow.com/questions/29487285/why-does-not-commit-transaction-of-requires-new) – Gimby

+0

メソッドを呼び出すだけでは適切なトランザクションコンテキストが適用されないため、EJBへの参照です。 @Gimbyのリンクの提案された答えを見てください – Sergio

答えて

0

使用する必要がありますsessionContext.getBusinessObject (FacadeBeanLocal.class);
REQUIRE_NEWを適用するBeanの別のインスタンスを取得するには。

@Stateless 
public class FacadeBean implements FacadeBeanRemote { 
    @PersistenceContext(unitName = "ejercicio7PU") 
    private EntityManager em; 
    @Resource 
    private SessionContext sessionContext; 

    private FacadeBeanLocal local; 

    @PostConstruct 
    void init() { 
     local = sessionContext.getBusinessObject(FacadeBeanLocal.class); 
    } 

    @Override 
    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void insertar(final long id) { 
     Record r = new Record(); 
     r.setId(id); 
     em.persist(r); 
    } 

    @Override 
    public void insertarTres(final long id1, final long id2, final long id3) { 
     Logger.getLogger(FacadeBean.class.getName()).log(Level.INFO, "Insertando registros"); 
     local.insertar(id1); 
     local.insertar(id2); 
     local.insertar(id3); 
    } 

} 
関連する問題