viernes, 6 de agosto de 2010

Propagación del contexto de persistencia

La propagación de contexto de persistencia se produce sólo para los EntityManager gestionados por el contenedor. En un EntityManager gestionado por el contenedor en el contexto de una transacción (caso común en un entorno Java EE), la propagación de transacciones JTA es la misma que la del contexto de persistencia. En otras palabras, los EntityManagers gestionados con ámbito de transacción obtenidos dentro de una misma transacción JTA comparten el mismo contexto de persistencia. En términos de Hibernate, esto significa que todos los gestores comparten la misma sesión.

Importante: el contexto de persistencia nunca es compartido por diferentes transacciones JTA o entre EntityManagers que no vienen del mismo EntityManagerFactory. Hay algunas
excepciones dignas de mención para la propagación del contexto al utilizar contextos extendidos de persistencia:

• Si, un SLSB, MDB o SFSB con un contexto de persistencia en ámbito de transacción invoca un método de un SFSB con contexto de persistencia extendido en la misma transacción JTA, se lanza una IllegalStateException.

• Si un SFSB con un contexto de persistencia extendido invoca a un SLSB o SFSB con contexto de persistencia de ámbito de transacción dentro de la misma transacción JTA, el contexto persistencia se propaga.

• Si un SFSB con un contexto de persistencia extendido llama a un SFSB o SLSB dentro de un contexto distinto de transacción JTA, el contexto de persistencia no se propaga.

• Si un SFSB con un contexto de persistencia extendido instancia otro SFSB con un contexto de persistencia extendido, el contexto de persistencia extendido es heredado por el segundo SFSB. Si el segundo SFSB sesión se llama con un contexto de transacción diferente que el primero, un IllegalStateException es lanzada.

• Si un SSB con contexto de persistencia extendido llama a un SFSB con un contexto persistencia extendido diferente en la misma transacción, una IllegalStateException es lanzada.

viernes, 30 de julio de 2010

Seam: Eliminar el mensaje "Transaction Failed"

Si queremos eliminar el mensaje "Transaction Failed" que aparece cada vez que falla una transacción y que Seam automáticamente pone en el "FacesMessages" se puede hacer de dos formas:

1. Añadiendo al fichero seam.properties la siguiente línea:

org.jboss.seam.transaction.facesTransactionEvents.transactionFailedMessageEnabled=false

2. Añadiendo al fichero components.xml la siguiente configuración:

<component name="org.jboss.seam.transaction.facesTransactionEvents">
<property name="transactionFailedMessageEnabled">false</property>
</component&gt
;

sábado, 17 de julio de 2010

Contexto de persistencia extendido

Cuando inyectamos un contexto de persistencia extendido con @PersistenceContext(type = EXTENDED) en primera instancia estamos indicando que el ciclo de vida del contexto de persistencia y del EntityManager están ligados al ciclo de vida del bean en el que lo injectamos y no de la transacción activa en el momento de la llamada a un método de negocio. Esto afecta a las operaciones sobre entidades de la siguiente manera:

En un contexto de persistencia EXTENDIDA, todas las operaciones de sólo lectura del EntityManager pueden ejecutarse al margen de una transacción (find (), getReference (), refresh (), y consultas de lectura). Algunas operaciones de modificaciones pueden ejecutarse al margen de una transacción, pero se ponen en cola hasta que el contexto persistencia se une a una transacción: este es el caso de persist (), merge (), remove (). Algunas operaciones no pueden ser llamadas fuera de una transacción: flush (), lock (), y consultas de eliminación de tipo update/delete.

viernes, 11 de junio de 2010

Richfaces: sortBy y filterBy fallan con tooltips.

Si definimos los atributos filterBy y sortBy de una <rich:column> y dentro de la columna tenemos un componente <rich:tooltip>, al intentar ordenar o filtrar no se muestran los resultados.

jueves, 10 de junio de 2010

Seam: obtener vista actual

Mediante EL se puede obtener la vista actual con #{view.viewId} y #{facesContext.viewRoot.viewId}. En código se puede obtener con FacesContext.getCurrentInstance().getViewRoot().getViewId().