2016-10-19 2 views
0

Ich habe folgende Entitätsklassen:Hibernate versucht Zeilen in einer nicht vorhandenen Tabelle in saveOrUpdate Methode löschen

KlasseA, ClassB und ClassC. ClassC erweitert ClassB, die ClassA erweitert.

Es gibt eine andere Entitätsklasse namens ClassWithALongName.

KlasseA hat eine viele-zu-eins-Beziehung mit ClassWithALongName, die wie unten definiert ist:

public class ClassWithALongName { 
    @ManyToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    private ClassA myClassA; 

    // getter-setter of myClassA 
} 

Sagen wir aClassC eine ClassC Instanz ist und die folgenden Zeilen aus:

org.hibernate.Session session = (Session)getEntityManager().getDelegate(); 
session.saveOrUpdate(aClassC); 
session.flush(); 

Nach Dies bedeutet, dass drei Update-Anweisungen für ClassA, ClassB und ClassC ausgeführt werden, die erwartet werden.

Was habe ich nicht erwartet, ist eine Delete-Anweisung auf eine Tabelle, die nicht als so existiert:

delete from ClassA_ClassWithALongName where ClassA_id=? 

Die letzte Anweisung bewirkt, dass eine Ausnahme, da die tatsächlichen Klassen längere Namen haben und so die temporäre Kennung ClassA_ClassWithALongName hat tatsächlich mehr Zeichen. Da Oracle db Tabellen verhindert, deren Namen mehr Zeichen als 30 enthalten, wird eine Ausnahme ausgelöst.

Ich habe zwei Dinge nicht verstanden. Warum ist dieses Löschen erforderlich, wenn nur Aktualisierungsanweisungen ausgeführt werden? Warum erstellt Hibernate eine solche temporäre Kennung, die nicht mit einer Tabelle in der Datenbank übereinstimmt.

Danke für Hinweise.

Als Antwort auf Justas Kommentar, die Ausnahme ist:

java.sql.SQLSyntaxErrorException: ORA-00972: identifier is too long 

Essex Boy Antwort hat mir geholfen, das Problem zu lösen. Die Entitäten sind sehr komplex und jemand hat eine Liste mit einer Eins-zu-viele-Verknüpfung hinzugefügt, die ich nicht bemerkt habe. Ich verstehe immer noch nicht, warum es eine Notwendigkeit für eine DELETE-Anweisung während einer Aktualisierung ist, aber ich werde das für den Augenblick verlassen :)

+0

Welche Ausnahme erhalten Sie:

eine Tabelle, die Sie brauchen, um etwas wie beitreten zu verhindern? – Justas

Antwort

1

ClassA_ClassWithALongName ist eine Tabelle, die beitreten

erwartet Hibernate Ich denke, Sie haben @OneToMany Beziehung irgendwo.

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
@JoinColumn(name="DICTIONARY_ID") 
Verwandte Themen