JAXB Reimport zu Hibernate DB -> Exception

membersound

Bekanntes Mitglied
Hallo,

ich habe eine Exception und kommt einfach nicht dahinter, warum sie geworfen wird. Vielleicht könnt ihr mir helfen?

In meinem Programm kann ich Personen anlegen. Jede Person hat eine Liste mit Payments, die sie getätigt hat.
Die Datenbankanbindung mit Hibernate funktioniert tadellos.

Nun exportiere ich meine Objekte als XML mit Hilfe von JAXB. Geht auch gut. Auch der Reimport klappt.

ABER: es funktioniert nur so lange, wie ich Payments zur zuletzt erstellten Person hinzufüge.
Wenn ich zB ein Payment zur 2. Person hinzufüge, dann exportiere und einen reimport mache, bekomme ich die Exception.

Der Code ist zu viel um ihn hier zu posten, aber vielleicht hatte ja jemand schonmal sowas? Oder kann aus dem Stacktrace etwas herauslesen?

Danke vielmals!

Java:
16:23:09,332  WARN JDBCExceptionReporter:233 – SQL Error: -104, SQLState: 23505
16:23:09,332 ERROR JDBCExceptionReporter:234 – integrity constraint violation: unique constraint or index violation; SYS_CT_10410 table: PERSON_PAYMENT
javax.persistence.RollbackException: Error while committing the transaction
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:93)
	at session.ModelDao.persist(ModelDao.java:50)
	at session.Controller.persistAfterFileLoad(Controller.java:123)
	at gui.actions.CreateFileDialog.open(CreateFileDialog.java:113)
	at gui.actions.CreateFileDialog.run(CreateFileDialog.java:62)
	at gui.MainWindow$1.run(MainWindow.java:744)
	at org.eclipse.jface.action.Action.runWithEvent(Action.java:498)
	at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:584)
	at org.eclipse.jface.action.ActionContributionItem.access$2(ActionContributionItem.java:501)
	at org.eclipse.jface.action.ActionContributionItem$5.handleEvent(ActionContributionItem.java:411)
	at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
	at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1053)
	at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:4165)
	at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3754)
	at org.eclipse.jface.window.Window.runEventLoop(Window.java:825)
	at org.eclipse.jface.window.Window.open(Window.java:801)
	at gui.MainWindow$23.run(MainWindow.java:819)
	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:332)
	at gui.MainWindow.main(MainWindow.java:808)
Caused by: javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
	at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1315)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:81)
	... 18 more
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:188)
	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
	at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
	at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
	at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:76)
	... 18 more
Caused by: java.sql.BatchUpdateException: integrity constraint violation: unique constraint or index violation; SYS_CT_10410 table: PERSON_PAYMENT
	at org.hsqldb.jdbc.JDBCPreparedStatement.executeBatch(Unknown Source)
	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
	... 26 more
 
N

nillehammer

Gast
Ich würde schätzen, dass Du die ids mit in Dein XML exportierst und hinterher wieder importierst. Beim Versuch, das dann zu speichern, stellt die DB in der Beziehungstabelle PERSON_PAYMENT fest, dass es die Kombination von personId und paymentId schon gibt und schmeißt die Exception. Versuch mal, statt save, saveOrUpdate oder update zu benutzen.

Und dann noch zwei Dinge zum Nachdenken:
- Die Beziehung sieht für mich nach 1:n aus. Das würde man mit einem Fremdschlüssel in der Payment-Tabelle machen können. Warum die Beziehungstabelle? Die würde man eher für m:n benutzen.
- Muss es wirklich eine List sein? Dafür muss nämlich eine Index-Spalte angelegt werden. Tut's nicht auch ein Set?
 
Zuletzt bearbeitet von einem Moderator:

membersound

Bekanntes Mitglied
Also die Payment-List habe ich mit @OneToMany annotiert, weil eine Person mehrere Payments haben kann. Deshalb die 1:n Beziehung.
Die Tabellenerstellung an sich, also auch die Beziehungstabelle, erstellt Hibernate ja automatisch.

Ich sollte vielleicht noch dazu sagen, dass ich in der persistence.xml folgende Property gesetzt habe:
<property name="hibernate.hbm2ddl.auto" value="create" />

Deshalb verstehe ich die Exception auch nicht, weil die DB ja beim Starten der App leer ist (das regelt ja die property).
Das Payment anlegen geht ja soweit auch, und wird auch korrekt in die Datenbank verfrachtet.
Nur wenn ich dann den Datenbestand exportiere und das App restarte (somit eine empty DB habe), dann kommt es zu dieser Exception beim import. Und auch nur, wenn das Payment wo anders als bei der zuletzt erzeugten Person eingefügt wird.
Das raff ich auch nicht. Wenn ich das Payment bei der letzten Person erzeuge, dann funktioniert alles wunderbar!


List oder Set, was wäre denn der Vorteil bzw Unterschied, wenn ich statt List ein Set benutze? Ich habe list jetzt nicht mit einem bestimmten Hintergedanken genommen, sondern einfach nur zum sammeln der Payments...

Danke
 

membersound

Bekanntes Mitglied
Ich habe nun herausgefunden, dass mit <property name="hibernate.hbm2ddl.auto" value="update" /> alles perfekt funktioniert.

Das ist echt merkwürdig. Create sorgt ja nur für eine frische DB. Kann mir das nicht erklären...

Ich weiß übrigens doch wieder, warum ich eine List genommen habe: damit ist es einfacher die Objekte in einer DataTable oder generell Listen-Widgets darzustellen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B JaxB und @XmlIDREF mit Interface Allgemeine Java-Themen 1
B JAXB zu DOM Allgemeine Java-Themen 8
F Xmlbeans und jaxb Allgemeine Java-Themen 0
I JAXB Problem Allgemeine Java-Themen 9
B XML File JAXB Allgemeine Java-Themen 0
M Jaxb und JPA: A cycle is detected in the object graph Allgemeine Java-Themen 5
M Java Objekte in XML mit JAXB Allgemeine Java-Themen 9
J JAXB Problem mit (zu großem?) Array Allgemeine Java-Themen 3
F JAXB / Listen durchlaufen Allgemeine Java-Themen 17
Shoox Hibernate / JAXB für Schnittstellen Allgemeine Java-Themen 4
alderwaran jaxb xsd schema, min/maxoccurs macht was? Allgemeine Java-Themen 7
N Speichern und laden in XML nicht via JAXB Allgemeine Java-Themen 4
G JAXB "no default constructor" Allgemeine Java-Themen 2
I Hibernate Envers - Aufruf der Methode zum Speichern selbst ausführen oder managen? Allgemeine Java-Themen 0
S org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: right near Allgemeine Java-Themen 6
P Hibernate Proxy Allgemeine Java-Themen 1
C Hibernate EJB JTA Allgemeine Java-Themen 4
Jay_030 Guice + Hibernate = Probleme? Allgemeine Java-Themen 2
G Hibernate search (Lucene) - Index wird nicht rechtzeitig erzeugt? Allgemeine Java-Themen 2
H Hibernate: @OneToOne Beziehung Allgemeine Java-Themen 4
N Hibernate und Fehlermeldung Allgemeine Java-Themen 18
neurox Tutorial: Hibernate mit MySQL (erste Schritte) Allgemeine Java-Themen 34
P Hibernate oder Java Persistence API? Allgemeine Java-Themen 3
A Spring und Hibernate Allgemeine Java-Themen 2
MQue log4j mit hibernate Allgemeine Java-Themen 3
F Hibernate speichern - Null Allgemeine Java-Themen 5
T Wie Hibernate im Tomcat installieren? Allgemeine Java-Themen 2
M Hibernate frage zur Verbindung Allgemeine Java-Themen 3
G Hibernate, JTable und Performance Allgemeine Java-Themen 17
G Obfuscator und Hibernate! Allgemeine Java-Themen 5
W JBoss,Axis2,Hibernate/JPA,Oracle - EntityManager Problem Allgemeine Java-Themen 4
T Hibernate Criteria Queries - Abfragen von Collection-Members Allgemeine Java-Themen 2
J Hibernate & Java Allgemeine Java-Themen 4
A Hibernate und Swing Allgemeine Java-Themen 2
G Hibernate speichert Daten nur während Session in HSQL-DB Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben