Esta regla marca los proyectos JPA que definen entidades JPA con relaciones utilizando una estrategia de cascada PERSIST, MERGE o ALL, para que sea consciente de un cambio de comportamiento predeterminado en la implementación de JPA 2.0 en WebSphere Application Server V8.5 y Liberty. Antes de la versión 8.5, cuando había una persistencia en cascada, se comprobaba la base de datos para ver si la entidad existía previamente. El nuevo comportamiento predeterminado es no comprobar primero, y generar una excepción de persistencia "La clave de entidad ya existe" si la entidad ya está en la base de datos. La ventaja del cambio de comportamiento es mejorar el rendimiento al evitar viajes adicionales a la base de datos.
No se espera que este cambio de comportamiento afecte a la mayoría de las aplicaciones. Para aprovechar el nuevo comportamiento, puede probar primero la aplicación en el entorno de la versión 8.5 antes de realizar cambios de código o volver a un comportamiento anterior.
Si le surgen problemas o si sabe que su aplicación
está programada para esperar que la operación de persistencia busque primero
en la base de datos nuevas entidades y no puede manejar la nueva posible
excepción de persistencia, puede volver al comportamiento anterior
estableciendo la propiedad openjpa.Compatibility
en persistence.xml:
|
<persistence-unit name="name" transaction-type="JTA"> ... <properties> <property name="openjpa.Compatibility" value="checkDatabaseForCascadePersistToDetachedEntity=true"/> </properties> </persistence-unit> |
La propiedad también puede establecerse como una propiedad del sistema JVM del servidor si no desea cambiar la aplicación.
Existe una regla Java y una regla XML asociada con este posible problema de aplicación para que sea más fácil de reconocer. Sólo se marcará un resultado por proyecto, aunque la persistencia de cascada se haya definido en varios lugares. Esto permite evaluar este problema en la aplicación en conjunto.
En concreto, debe evaluar las llamadas a las operaciones de EntityManager persist y merge para determinar si el código podrá manejar el cambio de comportamiento correctamente.
Después de evaluar la aplicación, puede desactivar esta regla en la configuración de análisis o ignorar los resultados generados.
La regla Java marcará alguna de las siguientes estrategias de cascada definidas en una anotación de relación:
Por ejemplo, los tipos de cascada se marcarán en las anotaciones de relación como @OneToOne.
|
@Entity public class Foo { private Bar bar; @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) public Bar getBar() { return bar; } } |
La regla XML marcará alguna de las siguientes estrategias de cascada definidas para una entidad en un archivo orm.xml:
|
<entity class="com.ibm.entities.Foo" access="FIELD"> <attributes> <one-to-one name="bar"> <cascade><cascade-persist/><cascade-merge/></cascade> </one-to-one> </attributes> </entity> |
Si ve alguno de estos elementos marcados, debe evaluar el código que invoca merge o persist en una entidad utilizando un estilo cascada de persistencia o fusión. Si el código de aplicación espera que se compruebe primero la base de datos antes de insertar una nueva entidad, la aplicación puede experimentar un cambio de comportamiento.
Si añade la propiedad openjpa.Compatibility en
persistence.xml, vuelva a ejecutar el análisis para asegurarse de que
no tiene nuevos resultados en la regla relacionada
Comprobar un cambio de comportamiento en la generación de código del metamodelo JPA relativo a ListAttribute.
Para obtener más información,