Hibernate: delete auf Join Table (Link Tabelle) ignoriert referentielle Integrität

Christopher0308

Grünschnabel
Hallo!

folgendes Szenario:

eine Tabelle:
Schulung
(PK: SchulungsID)
(Hash)Set Teilnehmer
...

von dieser Tabelle "erben" 2 weitere: Seminare und Workshops (beide haben als PK: SchulungsID)

desweiteren gibts eine Join-Table (Link-Tabelle) SchulungPerson (PK: SchulungsID und PersonID) über die Seminar- und Workshopteilnehmer zugeordnet werden.

Lösche ich nun mit Hibernate ein Seminar/Workshop zu dem noch Personen zugeordnet sind, wird die Referentielle Integrität "ausgehebelt". D.h. zuerst werden alle Einträge mit entsprechender SchulungsID aus der Join-Table gelöscht. Anschließend aus der Schulungstabelle und zum Schluss aus der Seminartabelle.

Ich erwarte eine ConstraintViolationException oder etwas in der Art...

Muss man irgendein Attribut im Mappingfile angeben?

Gruß
 
Zuletzt bearbeitet:
Wenn keine Exception fliegt, kommt das vermutlich daher, dass deine DB die referenzielle Integrität gar nicht prüft. Dass Hibernate dies nicht tu, okay... dass ist sicher ein Mappingproblem. Spätestens in der DB sollte die aber dann für Probleme sorgen. Klassisches Problem ist dabei MySQL mit MyISAM Tabellen anstelle von InnoDB.

Bzgl. der Mappings hat mein Vorposter schon alles gesagt ;)

REINHAUN!
 
Hi!

ich finds ja schon mal gut, dass sie jmd über mein Problem den Kopf zerbrechen will :)
Ich wollte euch mein mapping code ersparen, aber wen er gewünscht ist ...

Btw. nutze ich MySql mit InnoDb. Auf Datenbankebene greift die RI auch, sobald ich versuche eine Schulung zu löschen, die noch Teilnehmer hat.

hier ist mein Schulungsmapping (Training).
zur erinnerung: Eine Schulung ist entweder ein Seminar oder ein Workshop (realisert durch joined-subclass)

Code:
<hibernate-mapping>
    <class name="transfer.ToTraining" table="training">
        <id name="trainingId" type="java.lang.Integer">
            <column name="trainingId" />
            <generator class="native" />
        </id>
        <property name="from" type="date" column="von" length="10" not-null="true" />
        <property name="until" type="date" column="bis" length="10" not-null="true" />
        <property name="postcode" type="java.lang.Integer" column="postcode" not-null="true" />
        <property name="location" type="string" column="location" length="25" not-null="true" />
        <property name="street" type="string" column="street" length="45" />
        <property name="status" type="java.lang.Integer" column="status" not-null="true" />
        <set name="participants" inverse="false" table="training_person">
            <key>
                <column name="trainingId" not-null="true" />
            </key>
            <many-to-many entity-name="transfer.ToPerson">
                <column name="personId" not-null="true" />
            </many-to-many>
        </set>
        <joined-subclass name="transfer.ToSeminar" table="seminar" >
        <key column="trainingId" />
        <property name="name" type="string" column="name" length="30" not-null="true" />
        <property name="content" type="string" column="content" length="65535" not-null="true" />
        <property name="seminarcode" type="string" column="seminarcode" length="10" not-null="true" />
        <property name="price" type="java.lang.Double" column="price" precision="7" not-null="true" />
        <property name="inhouse" type="java.lang.Boolean" column="inhouse" not-null="true" />
        <property name="constancy" type="java.lang.Double" column="constancy" precision="3" scale="1" not-null="true" />
        <property name="participatorMin" type="java.lang.Integer" column="participator_min" not-null="true" />
        <property name="participatorMax" type="java.lang.Integer" column="participator_max" not-null="true" />
        </joined-subclass>
        <joined-subclass name="transfer.ToWorkshop" table="workshop">
        <key column="trainingId" />
        <many-to-one name="consultant" class="transfer.ToPerson" fetch="select">
            <column name="consultant" not-null="true" />
        </many-to-one>
        <many-to-one name="subject" class="transfer.ToSubject" fetch="select">
            <column name="subject" not-null="true" />
        </many-to-one>
        </joined-subclass>
    </class>
</hibernate-mapping>
 
Zuletzt bearbeitet:
Zurück