Constraint Exception

Status
Nicht offen für weitere Antworten.

MQue

Top Contributor
Hallo,

bin noch nicht ganz durch in hiebernate,
ich bekomme folgenden Fehler beim Löschen eines Eintrages in der Tabelle Events (bei einer n:m Beziehung zwischen Personen und Events -> altes Design):

SQL:
GDS Exception. 335544466. violation of FOREIGN KEY constraint "FKCEFC0473EB84A331" on table "Person_Event"

So weit ich mich jetzt an die Datenbank- Vorlesung errinnern kann macht mach beim Löschen einer Zeile, welche in einer anderen Tabelle referenziert ist: "on delete cascade"

ich hab jetzt in der Config- Datei von Person: cascade="all-delete-orphan" hineingeschriebnen, trotzdem bekomme ich noch die Fehlermeldung, muss ich in der Konfig- Datei von Events auch noch was reinschreiben?

lg
 
S

SlaterB

Gast
hier scheint es sich doch um einen Fehler zu handeln, dass ein Eintrag B gelöscht wird, während A immer noch auf B referenziert,
bei sowas hilft kein cascade, beim Löschen von B können doch nicht andere Tabellen nach referenzierenden Einträgen durchsucht und diese dann auch entfernt werden,

andersrum gehts: wenn A gelöscht wird, hilft das Cascade, auch das dann evtl. sinnlose B zu entfernen

---

du musst entweder den referenzierenden Eintrag löschen (statt den referenzierten)
oder die Referenz auf null setzen
 

MQue

Top Contributor
du musst entweder den referenzierenden Eintrag löschen (statt den referenzierten)
oder die Referenz auf null setzen

Das Problem ist nur, dass ich das mit Hibernate mache und Hibernate die Zwischentabelle selber erzeugt und das Problem zwischen den Tabellen Events und Person_Events(also der Zwischentabelle auftritt),

violation of FOREIGN KEY constraint "FKCEFC0473EB84A331" on table
"Person_Events"

Das auflösen der Referenzen müsste ja Hibernate selber machen, wenn ich in den Sets die Objekte lösche:

Java:
 eventDao.beginTransaction();        
 event.removeFromEvents(person);
 person.removeFromPerson(event);
 eventDao.delete(event);
 eventDao.commitTransaction();
Java:
public void removeFromEvents(Person person) {
        this.getParticipants().remove(person);
        person.getEventList().remove(this);
        }
Java:
public void removeFromPerson(Events event) {
        this.getEventList().remove(event);
        event.getParticipants().remove(this);
        }

Das müsste ja dann schon die Constraints auflösen, wenn ich die Objekte gegenseitig lösche??
 
Zuletzt bearbeitet:
S

SlaterB

Gast
mann oh mann, wie können 13 Code-Zeilen nur so kompliziert sein, ich sehe ja gar nicht durch ;)
also es gibt Person, Events, Participants (Liste vor Personen?)

dann vier Methoden,
- removeFromEvents
- removeFromPerson
bei denen nicht klar ist, wo sie sind, und wer sie je aufruft

+
- removeFromConnections
- removeFromMappingPool
deren Inhalt und Funktion ganz unklar ist,

am besten nochmal alles von vorne erklären ;)


-------

tritt die Exception bei
eventDao.delete(event);
auf?
> Fehler beim Löschen eines Eintrages in der Tabelle Events
ok

> ich hab jetzt in der Config- Datei von Person: cascade="all-delete-orphan" hineingeschriebnen

ja, dann empfiehlt sich wohl, das bei Event (auch) zu machen,
oder verzichte vorerst auf das Löschen des Events und schaue dir nach dem Ablauf die Datenbank an,
ist noch ein Eintrag in der Verbindungstabelle?
wird er von Person referenziert?
wird er von Event referenziert?
 

MQue

Top Contributor
Hallo,

PS: obigen code habe ich ausgebessert

Muss leider nochmal fragen bzgl constraints, ich steig da nicht ganz durch, ich habe eine Methode unten, mit welcher ich variable und connection zusammenfügen möchte:

Java:
 TVariable variable = databaseInterface.createAndStoreVariable(databaseName, CurrentStateEnum.NOT_CONNECTED.toString(), -1f);  
 final TConnection tconnection1 = databaseInterface.createAndStoreConnection("Connection1");
        databaseInterface.addConnectionToVariable(variable.getId(), tconnection1.getId());

Java:
public TConnection createAndStoreConnection(final String title) {
        final TConnection connection = new TConnection();
        connection.setTitle(title);
        manager.storeConnection(connection);
        return connection;
        }

Code:
protected void addConnectionToVariable(final Long variableId, final Long connectionId) {
        final Session session = getSession();
        session.beginTransaction();
        final TConnection tConnection = (TConnection) session.load(TConnection.class, connectionId);
        final TVariable tVariable = (TVariable) session.load(TVariable.class, variableId);        
        tVariable.getEvents().add(tConnection);
        session.getTransaction().commit();
        }

und bekomme folgenden Fehler:

Java:
WARNUNG: SQL Error: 335544466, SQLState: HY000
09.07.2009 08:42:16 org.hibernate.util.JDBCExceptionReporter logExceptions
SCHWERWIEGEND: GDS Exception. 335544466. violation of FOREIGN KEY constraint "FKBED41B8352C4EAFD" on table "TVARIABLE_TCONNECTION"
Foreign key reference target does not exist
09.07.2009 08:42:16 org.hibernate.event.def.AbstractFlushingEventListener performExecutions
SCHWERWIEGEND: Could not synchronize database state with session
org.hibernate.exception.GenericJDBCException: could not insert collection rows: [net.jank.ppos.hibernate.TVariable.events#4]

Ich versteh jetzt nicht, warum dieser Fehler jetzt auch beim Verbinden zweier Datensätze auftritt? beim Löschen hab ichs ja verstanden aber warum ein Constraint beim Verbinden auftritt ist mir ein Rätsel?
 
Zuletzt bearbeitet:
M

maki

Gast
Ich versteh jetzt nicht, warum dieser Fehler jetzt auch beim Verbinden zweier Datensätze auftritt? beim Löschen hab ichs ja verstanden aber warum ein Constraint beim Verbinden auftritt ist mir ein Rätsel?
Steht doch in deiner Fehlermeldung:
Code:
Foreign key reference target does not exist
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben