Archiv verlassen und diese Seite im Standarddesign anzeigen : [Erledigt] Hibernate Verständnis Fragen/Probleme
EagleEye
13.01.2009, 10:28
Ich bin ja gerade dabei ein altes Projekt (meinen Musik Manager) auf Hibernate umzubauen, laden der Daten klappt auch super nur das speichern macht mir noch kleine Probleme.
Es gibt bei mir die Objekte Artist, Label, Genre, Album, CD, Track. Artist, Label, Genre sind einfache Objekte mit ID und Name, wobei ich gesagt hab das bei allen 3 der Name unique sein soll. Das Album ist etwas komplexer und enthält alle anderen Objekte.
Erzeugt werden die Objekte entweder von Hand, d.h. der Benutzer gibt die Daten ein bzw. wählt vorhandene aus oder es wird bei Amazon nach den Alben gesucht, wobei hier immer neue Objekte erzeugt werden.
Fügt man einen Datensatz komplett neu ein, wo noch kein Artist, Label ... existiert klappt alles, fügt man aber ein Album neu hinzu, was schon einem Artist gehört gibts immer ne Exception. Seidenn ich ersetze diese doppelten Objekte durch ein bestehendes Objekt das aus der Datenbank geladen wurde.
Ich dachte das ich mit merge diese Daten automatisch aktualisieren lassen kann aber da hab ich mich wohl irgendwie geirrt. Daher meine Frage, kann ich das irgendwie von Hibernate machen lassen oder muss ich bevor ich speichere alle Daten von Hand setzen?
EagleEye
13.01.2009, 10:30
Hier mal die Fehlermeldung die nur kommt wenn der Artist, Label oder Genre schon existiert
javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(Transacti onImpl.java:71)
at de.eaglesite.eaglemusikmanager.io.SQLConnection.sa veAlbum(SQLConnection.java:98)
at de.eaglesite.eaglemusikmanager.io.SQLConnection.sa veAlbum(SQLConnection.java:82)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .addAlbums(AmazonAddDialog.java:395)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .access$1(AmazonAddDialog.java:389)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog $1.actionPerformed(AmazonAddDialog.java:100)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:177)
at java.awt.Dialog$1.run(Dialog.java:1039)
at java.awt.Dialog$3.run(Dialog.java:1091)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1089)
at java.awt.Component.show(Component.java:1419)
at java.awt.Component.setVisible(Component.java:1372)
at java.awt.Window.setVisible(Window.java:801)
at java.awt.Dialog.setVisible(Dialog.java:979)
at de.eaglesite.eaglemusikmanager.MainController.addA mazon(MainController.java:76)
at de.eaglesite.eaglemusikmanager.gui.ToolBar$2.actio nPerformed(ToolBar.java:121)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEven tMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:121)
Caused by: org.hibernate.exception.ConstraintViolationExcepti on: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert( SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.conver t(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:253)
at org.hibernate.jdbc.AbstractBatcher.prepareStatemen t(AbstractBatcher.java:92)
at org.hibernate.jdbc.AbstractBatcher.prepareStatemen t(AbstractBatcher.java:87)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchSta tement(AbstractBatcher.java:222)
at org.hibernate.persister.entity.AbstractEntityPersi ster.insert(AbstractEntityPersister.java:2229)
at org.hibernate.persister.entity.AbstractEntityPersi ster.insert(AbstractEntityPersister.java:2665)
at org.hibernate.action.EntityInsertAction.execute(En tityInsertAction.java:60)
at org.hibernate.engine.ActionQueue.execute(ActionQue ue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:167)
at org.hibernate.event.def.AbstractFlushingEventListe ner.performExecutions(AbstractFlushingEventListene r.java:298)
at org.hibernate.event.def.DefaultFlushEventListener. onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.j ava:1000)
at org.hibernate.impl.SessionImpl.managedFlush(Sessio nImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(J DBCTransaction.java:106)
at org.hibernate.ejb.TransactionImpl.commit(Transacti onImpl.java:54)
... 63 more
Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 insert into artists (name, artist_id) values (Amon Amarth, 162) wurde abgebrochen. Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchR esultHandler.handleError(AbstractJdbc2Statement.ja va:2512)
at org.postgresql.core.v3.QueryExecutorImpl.processRe sults(QueryExecutorImpl.java:1310)
at org.postgresql.core.v3.QueryExecutorImpl.execute(Q ueryExecutorImpl.java:347)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execut eBatch(AbstractJdbc2Statement.java:2574)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch( BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:246)
... 78 more
Exception occurred during event dispatching:
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.rollback(Transac tionImpl.java:82)
at de.eaglesite.eaglemusikmanager.io.SQLConnection.sa veAlbum(SQLConnection.java:103)
at de.eaglesite.eaglemusikmanager.io.SQLConnection.sa veAlbum(SQLConnection.java:82)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .addAlbums(AmazonAddDialog.java:395)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .access$1(AmazonAddDialog.java:389)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog $1.actionPerformed(AmazonAddDialog.java:100)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:177)
at java.awt.Dialog$1.run(Dialog.java:1039)
at java.awt.Dialog$3.run(Dialog.java:1091)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1089)
at java.awt.Component.show(Component.java:1419)
at java.awt.Component.setVisible(Component.java:1372)
at java.awt.Window.setVisible(Window.java:801)
at java.awt.Dialog.setVisible(Dialog.java:979)
at de.eaglesite.eaglemusikmanager.MainController.addA mazon(MainController.java:76)
at de.eaglesite.eaglemusikmanager.gui.ToolBar$2.actio nPerformed(ToolBar.java:121)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEven tMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:121)
SirWayne
13.01.2009, 12:09
Was willst du genau?? Von einem vorhandenen Objekt neue Werte setzen??
EagleEye
13.01.2009, 12:10
Das Hibernate merkt das dieses neue Objekt schon in der Datenbank ist und dementsprechend reagiert.
SirWayne
13.01.2009, 12:45
ja du bekommst eine exception auf die kannst du doch reagieren... wenn du willst dass er das neue Objekt entweder speichert oder updatet dann gibst die methode saveorupdate...
EagleEye
13.01.2009, 12:52
Die Methode gibt es bei mir nicht, ich arbeite mit dem EntetyManager der hat nur persist, find, merge, refresh und remove.
SirWayne
13.01.2009, 14:26
wenn du eine session hast kannst du diese methode anwenden...
http://www.hibernate.org/hib_docs/v3/api/org/hibernate/Session.html
EagleEye
13.01.2009, 14:28
Jo ich arbeite aber nicht mit Sessions :D
Geht das nicht anders?
SirWayne
13.01.2009, 15:47
ich kenn nur den weg über sessions ;)
Öhm, also bei mir hat das noch nie Probleme gemacht ... Du hast das Objekt, das aktualisiert werden soll, aber schon aus der DB?
Revenant
14.01.2009, 07:43
Mir ist immer noch nicht das Problem ganz klar. Kannst du mal ein textuelles Beispiel nennen wo das Problem auftreten würde?
EagleEye
14.01.2009, 08:37
Öhm, also bei mir hat das noch nie Probleme gemacht ... Du hast das Objekt, das aktualisiert werden soll, aber schon aus der DB?
Das ist ja das Problem, es stammt nicht aus der Datenbank ;)
Die Objekte sind alle neu erzeugt.
EagleEye
14.01.2009, 11:14
Ich hab gerade nochmal rumgespielt aber nichts hinbekommen.
Mir ist immer noch nicht das Problem ganz klar. Kannst du mal ein textuelles Beispiel nennen wo das Problem auftreten würde?
Also ich hab ein Objekt Album, das hat paar andere Objekte drin unter anderem Label. Das Label ist nur ne ID und nen Name, der Name ist unique, so dass er nur einmal vorhanden sein kann.
Jetzt erstelle ich neue Alben und die bekommen auch ein Label, aber es wird nicht ein Label aus der Datenbank geholt sondern ein neues Objekt erzeugt.
Jetzt würd ich Hibernate gern sagen das es nachsehen soll ob dieses Label schon in der Datenbank ist, wenn nicht einfügen. Ist es schon vorhanden sol ler das Objekt irgendwie so bearbeiten das er weiß das es die gleichen Einträge sind.
EagleEye
14.01.2009, 18:40
Ich habs jetzt erstmal so gelöst das ich immer nachseh ob der Eintrag schon vorhanden ist, wenn ja wird das schon geladene Objekt gekommen sonst aus der Datenbank.
Aber jetzt hab ich ein neues Problem, immer wieder bekomm ich diese Meldung wenn ich commit ausführen will.
hier der Code:
EntityTransaction transaction = entitymanager.getTransaction();
transaction.begin();
try
{
for(Album album : albums)
{
System.out.println(transaction.isActive());
entitymanager.merge(album);
// entitymanager.persist(album);
}
transaction.commit();
}
catch(Exception ex)
{
ex.printStackTrace();
transaction.rollback();
}
javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(Transacti onImpl.java:71)
at de.eaglesite.eaglemusikmanager.io.SQLConnection.sa veAlbum(SQLConnection.java:99)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .addAlbums(AmazonAddDialog.java:404)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .access$1(AmazonAddDialog.java:395)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog $1.actionPerformed(AmazonAddDialog.java:103)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:177)
at java.awt.Dialog$1.run(Dialog.java:1039)
at java.awt.Dialog$3.run(Dialog.java:1091)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1089)
at java.awt.Component.show(Component.java:1419)
at java.awt.Component.setVisible(Component.java:1372)
at java.awt.Window.setVisible(Window.java:801)
at java.awt.Dialog.setVisible(Dialog.java:979)
at de.eaglesite.eaglemusikmanager.MainController.addA mazon(MainController.java:80)
at de.eaglesite.eaglemusikmanager.gui.ToolBar$2.actio nPerformed(ToolBar.java:121)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEven tMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:121)
Caused by: org.hibernate.exception.ConstraintViolationExcepti on: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert( SQLStateConverter.java:71)
at org.hibernate.exception.JDBCExceptionHelper.conver t(JDBCExceptionHelper.java:43)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:253)
at org.hibernate.jdbc.AbstractBatcher.prepareStatemen t(AbstractBatcher.java:92)
at org.hibernate.jdbc.AbstractBatcher.prepareStatemen t(AbstractBatcher.java:87)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchSta tement(AbstractBatcher.java:222)
at org.hibernate.persister.entity.AbstractEntityPersi ster.insert(AbstractEntityPersister.java:2229)
at org.hibernate.persister.entity.AbstractEntityPersi ster.insert(AbstractEntityPersister.java:2665)
at org.hibernate.action.EntityInsertAction.execute(En tityInsertAction.java:60)
at org.hibernate.engine.ActionQueue.execute(ActionQue ue.java:279)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:263)
at org.hibernate.engine.ActionQueue.executeActions(Ac tionQueue.java:167)
at org.hibernate.event.def.AbstractFlushingEventListe ner.performExecutions(AbstractFlushingEventListene r.java:298)
at org.hibernate.event.def.DefaultFlushEventListener. onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.j ava:1000)
at org.hibernate.impl.SessionImpl.managedFlush(Sessio nImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(J DBCTransaction.java:106)
at org.hibernate.ejb.TransactionImpl.commit(Transacti onImpl.java:54)
... 62 more
Caused by: java.sql.BatchUpdateException: Batch-Eintrag 0 insert into artists (name, artist_id) values (Crematory, 707) wurde abgebrochen. Rufen Sie 'getNextException' auf, um die Ursache zu erfahren.
at org.postgresql.jdbc2.AbstractJdbc2Statement$BatchR esultHandler.handleError(AbstractJdbc2Statement.ja va:2512)
at org.postgresql.core.v3.QueryExecutorImpl.processRe sults(QueryExecutorImpl.java:1310)
at org.postgresql.core.v3.QueryExecutorImpl.execute(Q ueryExecutorImpl.java:347)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execut eBatch(AbstractJdbc2Statement.java:2574)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch( BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(Ab stractBatcher.java:246)
... 77 more
Exception occurred during event dispatching:
java.lang.IllegalStateException: Transaction not active
at org.hibernate.ejb.TransactionImpl.rollback(Transac tionImpl.java:82)
at de.eaglesite.eaglemusikmanager.io.SQLConnection.sa veAlbum(SQLConnection.java:104)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .addAlbums(AmazonAddDialog.java:404)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog .access$1(AmazonAddDialog.java:395)
at de.eaglesite.eaglemusikmanager.gui.AmazonAddDialog $1.actionPerformed(AmazonAddDialog.java:103)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:177)
at java.awt.Dialog$1.run(Dialog.java:1039)
at java.awt.Dialog$3.run(Dialog.java:1091)
at java.security.AccessController.doPrivileged(Native Method)
at java.awt.Dialog.show(Dialog.java:1089)
at java.awt.Component.show(Component.java:1419)
at java.awt.Component.setVisible(Component.java:1372)
at java.awt.Window.setVisible(Window.java:801)
at java.awt.Dialog.setVisible(Dialog.java:979)
at de.eaglesite.eaglemusikmanager.MainController.addA mazon(MainController.java:80)
at de.eaglesite.eaglemusikmanager.gui.ToolBar$2.actio nPerformed(ToolBar.java:121)
at javax.swing.AbstractButton.fireActionPerformed(Abs tractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed (AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed (DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultB uttonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseRe leased(BasicButtonListener.java:236)
at java.awt.AWTEventMulticaster.mouseReleased(AWTEven tMulticaster.java:272)
at java.awt.Component.processMouseEvent(Component.jav a:6038)
at javax.swing.JComponent.processMouseEvent(JComponen t.java:3260)
at java.awt.Component.processEvent(Component.java:580 3)
at java.awt.Container.processEvent(Container.java:205 8)
at java.awt.Component.dispatchEventImpl(Component.jav a:4410)
at java.awt.Container.dispatchEventImpl(Container.jav a:2116)
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.LightweightDispatcher.retargetMouseEvent( Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(C ontainer.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Conta iner.java:3916)
at java.awt.Container.dispatchEventImpl(Container.jav a:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429 )
at java.awt.Component.dispatchEvent(Component.java:42 40)
at java.awt.EventQueue.dispatchEvent(EventQueue.java: 599)
at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(E ventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispa tchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThre ad.java:121)
EagleEye
14.01.2009, 21:19
So damit es jetzt richtig komisch wird, ich hab gerade noch etwas mit Null rumprobiert.
Dabei kamen sehr komische Sachen raus, wenn das Album komplett neu ist, d.h. alle Attribute noch nie in der Datenbank waren. Kann ich es nicht speichern, dann kommt es zu der Exception da oben.
Enthält das Album aber einen Artist der schon aus der Datenbank stammt funktioniert es.
Hat jemand dafür eine Erklärung?
Am Besten postest du hier auch mal den Code von Album und Artist ... und von deiner kompletten SQLConnection-Klasse. Und wenn du dann noch Zeit und Lust hast, evtl. noch ein Beispiel, wie das Album zusammen gebaut wird.
EagleEye
15.01.2009, 09:56
Hier hab ich die Sachen mal zusammen gepackt, in src-test liegt eine Testdatei wo ich ein Album zusammen packe. Das ist die einzige Einfügeoperation die mal funktioniert hat.
Revenant
15.01.2009, 12:09
Ich habs jetzt erstmal so gelöst das ich immer nachseh ob der Eintrag schon vorhanden ist, wenn ja wird das schon geladene Objekt gekommen sonst aus der Datenbank.
Genau so hab ich das auch immer gemacht. Eine andere Möglichkeit ist mir auch nicht bekannt.
Zu dem anderen Problem:
Hast du mal entitymanager.persist(album); probiert? Das hast du da ja auskommentiert stehen. Was kommt dabei heraus?
Für mich sieht es so aus, als ob es ne Diskrepanz zwischen den Objekten im Code und denen in der Datenbank gibt.
Vllt befinden sich die Objekte noch in einer anderen Session in einem persistenten Zustand?
Oder vllt sind die Objekte noch gar nicht persistiert?
Ne andere Möglichkeit wäre, dass eines der Alben nicht mehr in der DB vorhanden also gelöscht ist.
Ansonsten fällt mir noch ein, dass es öfters zu solchen Problemen kommt wenn man zwei verschiedene entitymanager Instanzen verwendet.
Das sind jetzt erstmal meine Vermutungen vllt helfen die ja weiter. Ich schau mir den Code später mal an.
EagleEye
15.01.2009, 12:12
Ob merge oder persist macht keinen Unterschied, läuft beides gleich gut/schlecht.
Die Datenbank lasse ich komplett von Hibernate erstellen.
Ich hab garkeine Sessions nur einen Entitymanager.
Jo das Album ist nicht in der Datenbank vorhanden, weil es neu ist ;)
Mittlerweile hab ich aber eine Lösung gefunden, wobei das in meinen Augen mehr ein Workaround ist.
Alle Objekte die nicht in der Datenbank sind erstelle ich ja neu zusätzlich speichere ich sie in einer Hashtable ab damit ich, sollte das gleiche Objekt verlang werden, aber noch nicht in der Datenbank vorhanden ist, wieder das gleiche Objekt anbieten kann.
Das läuft auch nur trat der Fehler auch auf wenn ich nur ein Album einfügen wollte und diese Lösung dürfte eigentlich nur bei mehreren Alben helfen.
Alle Objekte die nicht in der Datenbank sind erstelle ich ja neu zusätzlich speichere ich sie in einer Hashtable ab damit ich, sollte das gleiche Objekt verlang werden, aber noch nicht in der Datenbank vorhanden ist, wieder das gleiche Objekt anbieten kann.
Das läuft auch nur trat der Fehler auch auf wenn ich nur ein Album einfügen wollte und diese Lösung dürfte eigentlich nur bei mehreren Alben helfen.
Äh ... hä?
EagleEye
15.01.2009, 12:52
die Methoden in der SQL Klasse sehen jetzt so aus
public Label createLabel(String name)
{
Label l = null;
try
{
l = (Label)entitymanager.createNamedQuery(Label.SQL_NA ME).setParameter("name", name).getSingleResult();
}
catch(NoResultException ex)
{
// ex.printStackTrace();
}
if(l != null)
return l;
l = labelhash.get(name);
if(l != null)
return l;
labelhash.put(name, l = new Label(name));
return l;
}
Weil mir eingefallen ist, will ich mehrere Alben gleichzeitig will er Artist & Co. ja auch mehrfach eintragen was er nicht darf.
Aber gestern hatten wir ja auch das ich einzelne Elemente nicht eintragen konnte, was durch diese Änderung ja nicht betroffen ist. Trotzdem läuft das alles jetzt.
Naja, ist ja opti, wenns jetzt geht! :)
EagleEye
15.01.2009, 13:24
jep nur hätte ich gern noch ne Erklärung warum es jetzt geht bzw warum es vorher nicht ging :D
Revenant
15.01.2009, 15:33
Äh ... hä?
ACK :D
und wayne solange alles jetzt funktioniert.
Evtl. würds ne Erklärung geben, wenn du nochmal verständlicher ausdrücken würdest, WAS du so alles gemacht hast, dass es geht bzw. was vorher nicht war, damit es nicht gegangen ist. Weil ich (und da bin ich scheinbar nicht allein ;) ) kann dir überhaupt gar nicht folgen.
EagleEye
15.01.2009, 18:54
Wir(Null+mich) haben uns darauf geeinigt das Hibernate wohl mehr mitbekommt als ich gedacht hab.
Als Info für die anderen, in meinem Programm gibts eine Suche, mit der sucht man Alben bei Amazon. Jedes Album das gefunden wird wird als Albumobjekt erzeugt und angezeigt (nicht in der Datenbank gespeichert).
Die Erzeugung der Objekte scheint das Problem gewesen zu sein.
1.Version egal was für Artist, Label ... es waren es wurde immer ein neues Objekt mit new erzeugt
- Das war defintiv falsch weil Hibernate die Objekte nicht richtig einfügen konnte da ich ihm entgegen meiner ersten Annahmen nicht sagen kann das er die Elemente anhand des Namens identifizieren soll
2.Version bei der Suche wird in der Datenbank nachgesehen ob das schon vorhanden ist oder nicht wenn nicht wird wieder mit new ein neues Objekt erzeugt
- mir ist aufgefallen das wenn ich 10 Alben gleichzeitig einfügen will ich 10 unterschiedliche Artist Objekte mit gleichem Namen haben kann
3. Version jetzt wird jedes Objekt was nicht in der Datenbank ist wird wieder mit new erzeugt, aber in einer Hashtable abgelegt so das es beim nächsten Mal von dort geholt werden kann
Version 3 funktioniert (derzeit) ohne Probleme.
Hat jemand eine Erklärung warum die 2. nicht funktioniert? Auch wenn ich 10 Alben gesucht hab, aber nur 1 Album einfüge.
vBulletin® v3.8.2, Copyright ©2000-2010, Jelsoft Enterprises Ltd.