Pregunta

Estamos funcionando con JBoss Hibernate y estamos teniendo este problema.

Cuando un bean de sesión utiliza un EntityManager para encontrar una entidad, ya puede existir en la memoria caché del EntityManager y su estado puede ser ya obsoleta. Si el código utiliza tal entidad para tomar decisiones, puede tomar decisiones equivocadas que producirían errores.

Este es un caso de ejemplo.

HTTP solicitud 1. Un bean de sesión crea una instancia de entidad y lo almacena con el campo "A" definida según el valor 1. La entidad PERSISTED consigue ID = 4.

solicitud HTTP 2. Un bean de sesión busca una entidad con ID = 4, establece su campo "A" para el valor 2 y lo guarda.

HTTP petición 3. Un bean de sesión busca una entidad con ID = 4 y comprueba su campo "A". Si el valor es 1 se hace una cosa, si es 2 lo hace otra cosa.

En caso de que la EM en la solicitud de 3 pasa a ser el mismo que en la solicitud 1, un comportamiento no deseado se produce. He probado esto y tiene aprox. 10% de los casos de fracaso.

Así que la pregunta es - cómo evitar esto? Llamando em.refresh () o em.clear () cada vez que tenga que asegurarse de que la entidad se encuentra al corriente parece ser un desperdicio de recursos.

¿Fue útil?

Solución

Artem,

Esto parece ser un href="https://stackoverflow.com/questions/1277719/shound-i-avoid-using-mappedby-to-keep-my-application-stable"> > entre sus preguntas :-)

Si bien entiendo que las respuestas que le han dado antes (incluyendo la mía) no puede ser lo que usted esperaba, que no vamos a cambiar:

    Gestor
  • entidad es un mapeado a Hibernate sesión y por lo general tiene que ser de corta duración. Aquí es una buena explicación de la unidad de trabajo, transacciones y ámbito de actuación ofrecen sesiones Hibernate, tomar una mirar si usted no ha visto antes.
  • Si su aplicación es persistentemente aferrarse a gestores de entidad, que debe considerar seriamente cambiar esa estrategia; si sólo lo hace en unos pocos lugares donde realmente necesitas transacciones largas de utilizar el método refresh() definitivamente hay el menor de todos los males.
  • caché de segundo nivel que tiene implementaciones agrupadas, caché de nivel de sesión no está sincronizado entre los por diseño y actualizaciones simultáneas a la misma entidad se manejan a través de bloqueo optimista proporcionada por Hibernate o bloqueo a nivel de aplicación.
  • Se podría, en teoría, (siempre que su acceso ORM se separa suficientemente bien) mantener su propia caché (para clúster si es necesario) de las entidades en poder de diversos responsables de la Entidad; lo que se necesita para registrar con cada uno para mantener su caché en sincronía. Yo aconsejaría fuertemente en contra de este enfoque, sin embargo -. No sólo es más bien involucrados para implementar y error propenso, pero usted se va contra el paradigma de Hibernate con este
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top