Hibernate: Zusammenspiel mit MySQL Foreign Keys?

DarthShader

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine kurze Frage zu Hibernate in Verbindung mit MySQL Foreign Keys:

Kommt Hibernate damit gut klar?

Ich meine damit, dass man ja in Hibernate solche Cascade-Einstellungen machen kann. Müssen die dann mit der Cascade-Einstellung des ForeignKeys exakt übereinstimmen? Gibt es noch Dinge, worauf ich unbedingt achten sollte?


Vielen Dank für Eure Hilfe!
 
Wenn ich dieses Thema nochmal ansprechen dürfte - ich finde das einfach keine Informationen im Netz. Hibernate (oder JPA) Cascade Annotations und MySQL Foreign Keys Cascade, wie verhält sich das zusammen?

Über Eure Hilfe würde ich mich sehr freuen
 
Was hast Du denn genau vor?

Willst Du durch Hibernate die MySQL Tabelle erstellen lassen oder auf eine extierende Tabelle zugreifen?
 
Also es geht im Prinzip um vorhandene Tabellen. Meine Frage wollte ich eher allgemein halten um rauszubekommen, wie sich Hibernate Cascade mit MySQL FK Cascades versteht.

Sagen wie z.B., ich habe im Hibernate Mapping nichts von Cascade angegeben. In der MySQL FK BEziehung habe ich jedoch Cascade für ON DELETE angegeben.

Wenn Hibernate nun etwas aus der Datenbank löscht, dann kommt MySQL durch das Cascade ja darauf, auch alle Kind-Elemente zu löschen. Weiß Hibernate das dann, kommt es damit klar?

Sicherlich gibt es auch noch andere Kombinationen, die man hinterfragen müsste.

Ziel ist es einfach zu entscheiden, ob ich beides verwende: Cascade in dem Hibernate Mapping sowie auch MySQL Foreign Keys mit Cascade Deklaration der Tabellen-Beziehungen.
 
In diesem Fall würde ich mit Hibernate oder JPA die Datenbankstruktur nachbauen ohne die @Cascade Annotation aus Hibernate zu verwenden.

Darüber hinaus sollte die "persistence.xml" die Zeile
<property name="hibernate.hbm2ddl.auto" value="update"/>​
nicht entahlten.

So könnte die persistence.xml dazu aus sehen:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<persistence>
	<persistence-unit name="myDatabase" transaction-type="JTA">
    	<jta-data-source>java:/myDatabaseDS</jta-data-source>

		<!-- Zu verwendende Service Provider Implementierung -->
    	<provider>org.hibernate.ejb.HibernatePersistence</provider>

    	<!-- Konfiguration der Service Provider Implementierung -->
      	<properties>
			<!-- 
				<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
				Flag, ob Tabellen automatisch erzeugt werden sollen z.B. 
				value="create-drop" oder validate, update, create 
				im Produktivbetrieb die Zeile nicht setzen! -->
                        <!--
			<property name="hibernate.hbm2ddl.auto" value="update"/>
                        -->

			<!-- URL der zu verwendenden Datenbank -->
			<property name="hibernate.transaction.manager_lookup_class"
					  value="org.hibernate.transaction.JBossTransactionManagerLookup"/>

			<!-- SQL-Dialect, den Hibernate verwenden soll -->
			<property name="hibernate.dialect"
			          value="org.hibernate.dialect.MySQL5InnoDBDialect"/>

			<!-- Flag, ob SQL-Statements ausgegeben werden sollen -->
			<property name="hibernate.show_sql" value="true"/>	
      </properties>   
	</persistence-unit>
</persistence>

So müsste es funktionieren, dass Hibernate nur als Mapper verwendet wird und sich nicht in die Datenbankstruktur ein mischt.

Wie es sich mit konkurrierenden Cascades zwischen DB und JPA verhält, kann ich Dir leider nicht beantworden.

Hoffentlich konnt ich Dir ein wenig weiter helfen!
 
Zuletzt bearbeitet:
Hi,

vielen Dank für Deine Antwort. Im Prinzip sieht meine Hibernate Konfiguration auch so aus. Nur, dass ich natürlich die Cascade Annotations in meinem Domain Modell habe.

Ich denke ich werde auf jeden Fall mal einen intensiven Test fahren, mal sehen wie sich diese Cascade auf beiden Seiten verhalten.

Danke!
 
Was mir eben gerade noch einfiel: es ist ja auch schlecht, das Cascade von Hibernate wegzulassen. Wenn ich z.B. ein transientes Objekte persistieren will, und zwar mit allen Referenzen (z.B. Klasse Person, die wiederum eine Referenz auf eine Adresse hat), so würde ein

session.save( person );

ja nicht gleich die Adresse mitspeichern. Um also einen kompletten Objektgraphen zu persistieren, müssten die Cascade Annotations ja schon sein... wenn ich das richtig verstanden habe.
 
Du kannst ja auch die Cascades von der MySQL Datenbank in die Entitäten per @Cascade Annotation übernehmen und die Update-Funktion in der psersistence.xml aktivieren, dann müsste Hibernate die entsprechenden Änderungen in der Datenbank vornehmen (bzw. keine Änderungen, wenn die Cascades 1:1 übernommen worden sind).

Allerdings würde ich dazu erst mal eine Kopie der Datenbank verwenden, um nichts zu zerschießen.
 
Hallo,

Du kannst ja auch die Cascades von der MySQL Datenbank in die Entitäten per @Cascade Annotation übernehmen und die Update-Funktion in der psersistence.xml aktivieren,

das habe ich leider nicht verstanden. Meine Entity-Klassen sind ja bereits mit "@Cascade" versehen, das sind die genau die Hibernate-Cascades von denen ich spreche.

Wie kann ich denn via "@Cascade" die MySQL Cascaed "in die Entitäten" übernehmen, was meinst Du damit?
 

Neue Beiträge

Zurück