Otra pregunta SCBCD: FlushMode

(Imagen: Paul Cézanne - La montaña Sainte-Victoire)

A business method of a stateless session bean with a transaction attribute REQUIRED executes a Java Persistence query on a container-managed persistence context.

Under which two conditions can the developer expect the persistence provider ensure that all changes made to the persistence context in the transaction are visible to the processing of the query? (Choose two)

  • The flush mode is NOT explicitly set.
  • The flush mode on the QUERY object is set to COMMIT.
  • The refresh method on the EntityManager is called.
  • The flush mode on the persistence context is set to AUTO but is NOT specified for the Query object
Tenemos dos posibles valores para el flush mode del EntityManager. Cuando está en AUTO, el flush se realiza automáticamente antes que se realize un query relacionado con entidades modificadas y al momento de darle commit a la transacción. Este es el valor por defecto, por lo que en la primera opción ese es el valor que toma el flush mode y ese es el comportamiento que necesitamos. Por lo tanto, la primera va. El otro valor posible es COMMIT, e implica que se da flush a los cambios sólo cuando se da commit a la transacción y no antes de un query. Y eso no es lo que queremos.


Ahora, la interfaz Query también posee un método setFlushMode que le permite cambiar el momento en el que se realiza el flush; para forzar un modo de flush diferente al del EntityManager para la duración del Query. Por ejemplo, una query quiere asegurarse que el EntityManager no haga flush antes de que se ejecute la query . Para esta situación, bastaría cambiar el modo de flush del query a COMMIT (query.setFlushMode(FlushModeType.COMMIT)). Pero esto no es lo que se quiere. De haber conservado el valor por defecto (FlushModeType.AUTO), se habría realizado el flush antes del Query, que es lo que necesitamos. Entonces, la segunda no va y la cuarta sí.

Por lo que la respuesta es la primera y la cuarta.

PS: Para no quedarnos con dudas en lo referente a la tercera alternativa; el método refresh de EntityManager toma por parámetro un objeto entidad y refresca su estado con valores tomados de la base de datos, sobreescribiendo cualquier cambio realizado. Nada que ver con la pregunta...no?



Pregunta tomada de ExamWorx

Publicar un comentario