PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Hibernate: aus One-To-Many Tabellen löschen


CoconutKing
2011-02-17, 14:04:47
Hallo,

ich habe 3 Tabellen in mysql:
User,Stromzähler,Zählerstände. Ein User kann mehrere Stromzähler haben, jeder Stromzähler kann mehrere Zählerstände haben.

Ich will mit Hibernate einen Stomzähler per ID löschen, und alle dazugehörigen Zählerstände. Bis jetzt hab ich es in 2 SQL abfragen verpackt, da ich den Stromzähler nicht löschen kann, solang noch Zählerstände vorhanden sind:

1) delete from zaehlerstand where stromzaehler_id = id
2) delete from stromzaehler where id = id

Kann Hibernate sowas automatisiert löschen? Hab zwar in den pojos per Annotations die entsprechenden Stellen mit (cascade=CascadeType.ALL) gekennzeichnet, damit hibernate alle zusammenhängenden werte kaskadiert bearbeitet, aber es funktioniert nicht.

Hibernate wirft nur ne Fehlermeldung wegen constraint key oder so, aber löscht nichts.

Ich könnt die obere Lösung behalten, da sie funktioniert, aber es gibt doch sicherlich ne elegantere Lösung die ich bisher nicht gefunden habe

Ectoplasma
2011-02-17, 17:54:15
... jeder Stromzähler kann mehrere Zählerstände haben.


Öhm, hab ich so einen Stromzähler schon mal gesehen? :confused:
Egal, das Zauberwort sollte delete orphan lauten.
Google da einfach mal nach.

Tiamat
2011-02-17, 18:45:51
Hi,

also es gibt da umfangreiche Möglichkeiten mit JPA solche Entitäten zu modellieren. cascade = CascadeType.ALL ist das schon das richtige Stichwort, falls du in der Klasse User eine Collection vom Typ <Stromzähler> hast. Die Klasse Stromzähler hat wiederum eine Collection vom Typ <Zählstand> mit cascadeType.ALL, dann sollte das gehen.

Dann würdest du mit em.getTransaction().begin(), em.remove() und em.getTransaction.commit() die Kette bis nach Zählstand löschen können.

JPA-Queries würd ich nur verwenden, wenn du wirklich spezielle Fälle hast, die man mit em.find() e.t.c nicht abfragen kann.

Gruß
Tiamat

Gast
2011-02-17, 21:39:40
Öhm, hab ich so einen Stromzähler schon mal gesehen? :confused:
Egal, das Zauberwort sollte delete orphan lauten.
Google da einfach mal nach.
Wenn man den stromverbrauch pro zähler pro zeit dokumentieren will bestimmt :)

Gast
2011-02-17, 23:59:04
Objekt Bäume können nicht über Delete Statements gelöscht werden.

Einzige Möglichkeit besteht im Aufruf von EntityManager.remove mit einem "attached" Entity.
Also: em.remove(em.find(EntityClass.class, id))

Gast
2011-02-18, 00:03:34
Objekt Bäume können nicht über Delete Statements gelöscht werden.

Einzige Möglichkeit besteht im Aufruf von EntityManager.remove mit einem "attached" Entity.
Also: em.remove(em.find(EntityClass.class, id))

Dabei werden dann alle Relationen mit CascadeType.ALL, CascadeType.DELETE gelöscht

Ectoplasma
2011-02-18, 01:31:20
Wenn man den stromverbrauch pro zähler pro zeit dokumentieren will bestimmt :)

Ja na klar, klingt im ersten Moment nur seltsam *gg*.

CoconutKing
2011-02-18, 09:13:34
hat jetzt geklappt, obwohl ich nichts am code geändert hab. meine testumgebung muss gesponnen haben, hat beim neustart der app auch die tabellen nicht mehr gedroppt !?

Noch ne dumme frage hinterher:
wenn ich bei dem one-to-many beziehungen den fetchtype auf Eager habe, müssten alle diese datensätze mitgeladen werden (da ja nicht lazyloading).

wie greif ich auf diese dann zu ohne weitere abfrage?

z.b. will ich einen stromzähler laden, und dank eager müssten alle zählerstände auch geladen werden.

Ectoplasma
2011-02-18, 13:05:33
Deine Stromzählerstände werden doch in einer Liste gespeichert, also greifst du über die Liste zu, die du bei der one to many Beziehung angegeben hast. War das deine Frage? Hibernate lädt alle one to many Beziehungen automatisch nach.

CoconutKing
2011-02-18, 14:24:45
omg, ich stand aufm schlauch.

im prinzip reichts ja wenn ich am anfang das user-object aus der db lade und den rest darüber auslese.

habe atm abfragen für den user, die stromzähler und die zählerstände implementiert :rolleyes:

naja dafür lernt man das ja ^^

Gast
2011-02-18, 21:07:55
hat jetzt geklappt, obwohl ich nichts am code geändert hab. meine testumgebung muss gesponnen haben, hat beim neustart der app auch die tabellen nicht mehr gedroppt !?


property: hibernate.hbm2ddl.auto

http://stackoverflow.com/questions/438146/hibernate-question-hbm2ddl-auto-possible-values-and-what-they-do/1689769#1689769