2009-06-24 14 views
0

Ich bin mit dem folgenden Problem konfrontiert und kann keine geeignete Lösung finden. Ich habe eine Beziehung A mit den Attributen id, x (Fremdschlüssel), y (Sequenznummer) und z (Inhalt). Außerdem gibt es eine Eindeutigkeitseinschränkung für x-y. Normalerweise habe ich Tupel wie (455, 159, 1, ...), (456, 159, 2, ...), (457, 159, 3, ...) usw. Ich benutze Hibernate und das ist die Zuordnungstabelle für eine bestimmte Klasse. Jetzt habe ich den Anwendungsfall, wo ich ein neues Objekt einfügen oder ein bereits bestehendes Objekt entfernen und die Sequenznummern der anderen Objekte aktualisieren möchte. Zum Beispiel, wenn ich ein neues Objekt direkt nach 1 einfüge, sollte es die Sequenznummer 2 erhalten und anschließend sollte das Objekt, das vorher 2 war, 3 werden, 3 sollte 4 usw. werden. Ähnliches sollte passieren, wenn Objekt 2 gelöscht wird - das alte 3 sollte dann 2 usw. werden.Doppelter Eintrag Fehler in MySQL/Hibernate

Allerdings bekomme ich eine ConstraintViolationException, wenn ein Update ausgelöst wird.

SEVERE: Could not synchronize database state with session org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update ... Caused by: java.sql.BatchUpdateException: Duplicate entry '159-2' for key 2

Ich kann nicht ganz erklären, warum dies geschieht. Es gibt keinen Commit/Session-Flush, also könnte ich Hibernate/MySQL in der Lage sein, die zeitliche Inkonsistenz zu handhaben und die Einschränkungen beim Commit prüfen. Gibt es etwas, was ich vermisse oder gibt es wirklich keine Möglichkeit, dies ohne größere Umgehungslösungen zu tun?

Prost

Antwort

1

Einig ID-Generatoren müssen direkt an die DB gehen, um eine ID zu erhalten.

Zum Beispiel mit dem native Generator mit einer AutoINCREMENT-Spalte in MySQL, wenn Sie save() aufrufen, wird es die Einfügung durchführen und die ID abrufen, auch wenn Sie die Sitzung nicht festgeschrieben haben.

Versuchen Sie, zu einem Hibernate-verwalteten Generator zu wechseln.

+0

OK - es gibt ein bisschen ein Missverständnis. Mein Fehler: Die Beziehung hat ein anderes automatisch generiertes ID-Attribut. Es gibt nur diese zusätzliche Eindeutigkeitsbeschränkung für den Fremdschlüssel/die Sequenznummer. – VHristov

Verwandte Themen