with type transactionattribute transaction transacciones persistencecontext ejemplo jpa jersey ejb-3.1 entitymanager

jpa - transactionattribute - transaction type jta



¿Cuándo se compromete EntityManager? (1)

No confundas el enrojecimiento con el compromiso. Durante el proceso de flush() proveedor de JPA envía físicamente el SQL generado a la base de datos y, en su caso, lee el ID generado y lo rellena en el bean. Tenga en cuenta que siempre debe usar la entidad devuelta en lugar de la original que se pasó a persist() :

token = em.persist(token);

El compromiso, por otro lado, realiza la confirmación de la base de datos. Obviamente, activará flush() primero, pero no te ayudará aquí. Pero como usted pregunta, cada método en EJB es transaccional por defecto. Esto significa que la transacción se confirma cuando abandona el primer EJB en la pila: si llama a un EJB desde otro, el destinatario se une a la transacción de llamada de forma predeterminada (consulte: comportamiento de propagación de transacción ).

También tenga en cuenta que las reglas para flush() son un poco complicadas ya que cada proveedor intenta hacer esto lo más tarde posible y en lotes.

Tengo el siguiente servicio ...

@Stateless @LocalBean public class RandomService { @EJB RandomString stringTokenizer; @PersistenceContext EntityManager em; public String generate(Actions action) { Token token = new Token(); token.setAction(action); token.setExpiry(new Date()); token.setToken(stringTokenizer.randomize()); em.persist(token); //em.flush(); return String.format("%010d", token.getId()) + token.getToken(); } }

Si no coloco em.flush (), la línea token.getId () devolverá nulo (usando DB GENERATED SEQUENCE), aunque sé si devuelvo Token en lugar de string al servicio que realiza la llamada. Parece que EM se vacia cuando el servicio devuelve un objeto token pero no cuando pongo String. Sin embargo, al poner color obtengo lo que necesito es así de bien?