Diese Regel markiert JPA-Projekte, die JPA-Entitäten mit Beziehungen definieren, die die Kaskadierungsstrategie PERSIST, MERGE oder ALL verwenden, um Sie auf eine Änderung des Standardverhaltens in WebSphere Application Server Version 8.5 und Liberty aufmerksam zu machen. Vor Version 8.5 wurde bei der Einstellung "cascade persist" geprüft, ob die Datenbank die Entität bereits enthält. Das neue Standardverhalten besteht darin, nicht zuerst zu prüfen und eine Persistenzausnahmebedingung „Entitätsschlüssel bereits vorhanden“ auszulösen, wenn die Entität bereits in der Datenbank vorhanden ist. Der Vorteil dieser Verhaltensänderung ist eine Leistungsverbesserung, weil zusätzliche Aufrufe an die Datenbank vermieden werden.
Diese Verhaltensänderung wirkt sich wahrscheinlich auf die meisten Anwendungen nicht aus. Um den Vorteil des neuen Verhaltens zu nutzen, können Sie die Anwendung zuerst in der Umgebung der Version 8.5 testen, bevor Sie Codeänderungen vornehmen oder zum vorherigen Verhalten zurückkehren.
Wenn Probleme auftreten oder wenn Sie wissen, dass Ihre Anwendung so geschrieben ist, dass sie erwartet, dass die Persistenzoperation zuerst in der Datenbank nach neuen Entitäten sucht und die neue mögliche Persistenzausnahme nicht behandelt, können Sie zum vorherigen Verhalten zurückkehren, indem Sie die Eigenschaft openjpa.Compatibility
festlegen in persistence.xml:
|
<persistence-unit name="name" transaction-type="JTA"> ... <properties> <property name="openjpa.Compatibility" value="checkDatabaseForCascadePersistToDetachedEntity=true"/> </properties> </persistence-unit> |
Die Eigenschaft kann auch als JVM-Systemeigenschaft des Servers gesetzt werden, wenn Sie die Anwendung nicht ändern möchten.
Es gibt eine Java-Regel und eine zugehörige XML-Regel für dieses potenzielle Anwendungsproblem, um Ihre Aufmerksamkeit zu erhöhen. Es wird nur ein einziges Ergebnis pro Projekt markiert, selbst wenn cascade persist an mehreren Stellen definiert ist. Dies gibt Ihnen die Möglichkeit, Ihre gesamte Anwendung auf dieses Problem hin zu untersuchen.
Insbesondere sollten Sie Aufrufe der EntityManager-Operationen
persist und merge überprüfen, um festzustellen, ob dieser Code die Verhaltensänderung ordnungsgemäß
behandelt.
Nach der Überprüfung Ihrer Anwendung können Sie diese Regel in Ihrer
Analysekonfiguration inaktivieren oder die generierten Ergebnisse ignorieren.
Die Java-Regel markiert jede der folgenden Kaskadierungsstrategien, die in einer Beziehungsannotation definiert sind:
Die Kaskadierungstypen werden beispielsweise in Beziehungsannotationen wie
@OneToOne markiert.
|
@Entity public class Foo { private Bar bar; @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}) public Bar getBar() { return bar; } } |
Die XML-Regel markiert jede der folgenden Kaskadierungsstrategien, die für eine Entität in einer Datei orm.xml definiert sind:
|
<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> |
Wenn Sie eines dieser Elemente markiert sehen, sollten Sie den Code überprüfen, der
merge oder persist für eine Entität aufruft, die
den Kaskadierungsstil persist oder merge verwendet. Wenn der Anwendungscode erwartet, dass die
Datenbank vor dem Einfügen einer neuen Entität zuerst geprüft wird, könnte in der Anwendung eine Verhaltensänderung auftreten.
Wenn Sie die EIgenschaft openjpa.Compatibility zu
persistence.xml hinzufügen, führen Sie Ihre Analyse erneut aus, um sicherzustellen, dass Sie keine neuen Ergebnisse für die zugehörige
Regel Prüfen auf Verhaltensänderung bei der Generierung des JPA-MetaModel-Codes in Bezug auf ListAttribute erhalten.
Weitere Informationen: