2016-09-02 9 views
0

У меня есть следующая EJB сессионный компонент:Как я могу получить транзакцию изоляции на EJB?

@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); 
    } 

} 

И сущность записи следующее:

@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 для вставки три числа:

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

Теперь, когда я снова вызываю удаленный метод со следующими номерами:

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

Числа 4 и 5 сохраняются, даже если исключение происходит по номеру 3.

Я попытался установить метод вставки с

@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 

, но он не работает для моего

+0

Упс забыл что-то добавить к этому предыдущему комментарию, я имею в виду его отдельно, везде, где вы вызываете insertarTres(). – Gimby

+3

Возможный дубликат [Почему не совершает транзакцию Requires \ _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.

@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); 
    } 

}