Cascade.All greift nur nach Jetty bzw. Tomcat neustart

andyx1975

Aktives Mitglied
Hallo,

ich verwende EclipseLink 2.4 und habe ein kleines Problem mit "cascade = CascadeType.ALL". Ich habe folgende Beziehung in 2 DataEntity Klassen erstellt:


OneToMany Beziehung in der Klasse DMerch
Java:
   @OneToMany( cascade = CascadeType.ALL, mappedBy = "merch", fetch = FetchType.EAGER )
    private List<DMerchStock> merch_items;

Gegenstück in Klasse DMerchStock
Java:
   @ManyToOne( fetch = FetchType.EAGER )
    @JoinColumn( name = "merch_id" )
    private DMerch merch;

Zu jedem Entity DMerch existieren also X MerchStock Items. Lösche ich jetzt ein Merch Item, möchte ich dass alle zugewiesene MerchStockItems auch gelöscht werden. Dies funktioniert jedoch nur, nachdem ich den Jetty bzw. Tomcat neu starte. Was kann mein Problem sein? Die folgende Fehlermeldung erscheint:

Java:
[EL Warning]: 2012-08-06 14:38:50.895--UnitOfWork(118401910)--Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.DatabaseException
Internal Exception: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`webadmin`.`merchstock`, CONSTRAINT `FK_merchstock_merch_id` FOREIGN KEY (`merch_id`) REFERENCES `merch` (`MERCH_ID`))
Error Code: 1451

Meine Persistence sieht wie folgt aus:
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

<persistence-unit name="LSF-5434" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/webAdmin"/>
<property name="javax.persistence.jdbc.user" value="root"/>
<property name="javax.persistence.jdbc.driver" value="org.gjt.mm.mysql.Driver"/>
<property name="eclipselink.jdbc.batch-writing" value="JDBC"/>
<property name="javax.persistence.jdbc.password" value="xxx"/>
<property name="eclipselink.ddl-generation.output-mode" value="both"/>
<property name="eclipselink.ddl-generation" value="create-tables"/>
<property name="eclipselink.logging.level" value="OFF"/>
<!-- property name="eclipselink.ddl-generation" value="none"/ -->
<!-- property name="eclipselink.ddl-generation" value="drop-and-create-tables"/ -->
</properties>
</persistence-unit>

</persistence>
[/XML]
 
Zuletzt bearbeitet:
N

nillehammer

Gast
CascadeType.ALL suggeriert zwar, dass alles enthalten ist, aber genau das, was Du suchst, ist darin nicht enthalten. Was Du suchst heißt "orphanRemoval" und ist bei der OneToMany-Annotation anzugeben:
Java:
@OneToMany( cascade = CascadeType.ALL, mappedBy = "merch", orphanRemoval=true, fetch = FetchType.EAGER )
Und FetchType.EAGER ist nur bei kleinen Collections zu empfehlen, die selbst keine Relationen zu vielen anderen Entities haben. Ansonsten kommst Du nämlich schnell dahin, dass die Anzeige eines einzigen Parent-Objektes im Hintergrund zur Abfrage großer Teile des Datenbestandes führt.
 

andyx1975

Aktives Mitglied
Hallo,

danke für deine Antwort. Beim Googlen bin ich auch schon einmal auf diese Lösung gestoßen. Jedoch zeigt mir Eclipse einen Fehler an. Hast du eine Idee was das sein kann? Er kennt "orphanRemoval=true" nicht. Wie gesagt, verwende das aktuellste EclipseLink

attachment.php
 

Anhänge

  • orphan.jpg
    orphan.jpg
    100 KB · Aufrufe: 44

andyx1975

Aktives Mitglied
ok nachdem ich das Package "ejb-api-3.0.jar" entfernt hatte...funktioniert es... jetzt kann ich auf "orphanRemoval=true" zugreifen. Aber ich habe immer noch das gleiche Problem. Ich kann erst Merch Objekte löschen, wenn ich den Tomcat neustarte!!! Jemand eine Idee? Ich bin momentan ratlos!?!?!
 

Ähnliche Java Themen

Neue Themen


Oben