Hello
I'm developing a time management tool using Struts and Hibernate. Nearly everything works fine. There are allready database UPDATEs and INSERTs that works for other parts of the application but in one part it throws an exception.
I've searched for hours already but I cannot see why it happens and what's the difference to my other code. The problem is, that it only should update a row from the table [MA-WO-Kalender] (should change a flag if the week/month is open to edit or closed) but it performs an INSERT. So it tries to insert a row with a primary key that already exists, which of course fails.
I've debugged it, and I cannot see, why it trys to insert. The object that should be updated is "week" -> kalenderDAO.save(week);
Here is the stuff that I hope should help you (and me ;-)):
Hibernate version: 3.1
Mapping documents:
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.ris.db.orders.MaWoKalender" table="`MA-WO-Kalender`" schema="dbo">
<id name="maWoKalenderId" type="java.lang.Integer">
<column name="`MA-WO-Kalender-ID`" />
<generator class="identity" />
</id>
<property name="wochenId" type="java.lang.Integer">
<column name="`Wochen-ID`" />
</property>
<property name="personalId" type="java.lang.Integer">
<column name="`Personal-ID`" />
</property>
<property name="erfAbgeschlossenJn" type="java.lang.Short">
<column name="Erf_abgeschlossenJN" not-null="true" />
</property>
<property name="monatsabschluss" type="java.lang.String">
<column name="Monatsabschluss" length="50" />
</property>
<property name="erfAbgeschlMonatJn" type="java.lang.Short">
<column name="Erf_abgeschlMonatJN" not-null="true" />
</property>
<property name="verbuchtJn" type="java.lang.Short">
<column name="VerbuchtJN" not-null="true" />
</property>
<property name="kontrolleLogin" type="java.lang.String">
<column name="Kontrolle_Login" length="30" />
</property>
<property name="kontrolleDatum" type="java.util.Date">
<column name="Kontrolle_Datum" length="23" />
</property>
<property name="kontrolleLoginMonat" type="java.lang.String">
<column name="Kontrolle_Login_Monat" length="30" />
</property>
<property name="kontrolleDatumMonat" type="java.util.Date">
<column name="Kontrolle_Datum_Monat" length="23" />
</property>
</class>
</hibernate-mapping>
Code between sessionFactory.openSession() and session.close():Code:
// Create DB-Object for Update and start transaction
MaWoKalenderDAO kalenderDAO = new MaWoKalenderDAO();
kalenderDAO.getSession().beginTransaction();
// Get data for selected week
MaWoKalender week = jumpToWeek(wochenId, weekList);
if (week == null) {
// selected week not found. Update failed
return new Boolean(false);
}
try {
// Set the changed values into week object
week.setErfAbgeschlossenJnBoolean(erfAbgeschlossenJn);
week.setErfAbgeschlMonatJnBoolean(erfAbgeschlMonatJn);
// Save changes into DB
kalenderDAO.save(week);
// Commit changes
kalenderDAO.getSession().getTransaction().commit();
return new Boolean(true);
} catch (RuntimeException er) {
er.printStackTrace();
return new Boolean(false);
}
Full stack trace of any exception that occurs:Code:
Hibernate: insert into ZE_ENTW.dbo.[MA-WO-Kalender] ([Wochen-ID], [Personal-ID], Erf_abgeschlossenJN, Monatsabschluss, Erf_abgeschlMonatJN, VerbuchtJN, Kontrolle_Login, Kontrolle_Datum, Kontrolle_Login_Monat, Kontrolle_Datum_Monat) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
org.hibernate.exception.SQLGrammarException: could not insert: [com.ris.db.orders.MaWoKalender]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1986)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2405)
at org.hibernate.action.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:37)
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:248)
at org.hibernate.event.def.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:269)
at org.hibernate.event.def.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:167)
at org.hibernate.event.def.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:101)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:186)
at org.hibernate.event.def.DefaultSaveEventListener.saveWithGeneratedOrRequestedId(DefaultSaveEventListener.java:33)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:175)
at org.hibernate.event.def.DefaultSaveEventListener.performSaveOrUpdate(DefaultSaveEventListener.java:27)
at org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:70)
at org.hibernate.impl.SessionImpl.fireSave(SessionImpl.java:530)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:518)
at org.hibernate.impl.SessionImpl.save(SessionImpl.java:514)
at com.ris.db.orders.MaWoKalenderDAO.save(MaWoKalenderDAO.java:43)
at com.ris.bo.reg.WeeksRegBo.saveWeekFlags(WeeksRegBo.java:214)
at com.ris.struts.action.ChangeWeekAction.execute(ChangeWeekAction.java:81)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:710)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:228)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:212)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:818)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:624)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:445)
at java.lang.Thread.run(Thread.java:595)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Cannot insert duplicate key row in object 'MA-WO-Kalender' with unique index 'IX_MA-WO-Kalender'.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(Unknown Source)
at com.microsoft.sqlserver.jdbc.IOBuffer.processPackets(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.getPrepExecResponse(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PreparedStatementExecutionRequest.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.CancelableRequest.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeRequest(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeUpdate(Unknown Source)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:1968)
... 35 more
Hibernate: select wozeorders0_.[WO-Zeiterf-ID] as WO1_6_, wozeorders0_.[MA-WO-Kalender-ID] as MA2_6_, wozeorders0_.[Auftrag-Typ-ID] as Auftrag3_6_, wozeorders0_.[Auftrag-ID] as Auftrag4_6_, wozeorders0_.[Auftrag-Kurzbezeichnung] as Auftrag5_6_, wozeorders0_.[Mo-ZeitStd] as Mo6_6_, wozeorders0_.[Di-ZeitStd] as Di7_6_, wozeorders0_.[Mi-ZeitStd] as Mi8_6_, wozeorders0_.[Do-ZeitStd] as Do9_6_, wozeorders0_.[Fr-ZeitStd] as Fr10_6_, wozeorders0_.[Sa-ZeitStd] as Sa11_6_, wozeorders0_.[So-ZeitStd] as So12_6_, wozeorders0_.[WO-KommentarJN] as WO13_6_, wozeorders0_.[WO-Kommentar] as WO14_6_, wozeorders0_.Projekt_HauptNr as Projekt15_6_ from ZE_ENTW.dbo.[web_vw_Orders] wozeorders0_ where wozeorders0_.[MA-WO-Kalender-ID]=?
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Hibernate: select deterfassu0_.[Detail-Zeiterf-ID] as Detail1_1_, deterfassu0_.[WO-Zeiterf-ID] as WO2_1_, deterfassu0_.[Tag-ID] as Tag3_1_, deterfassu0_.[Detail-Code-ID] as Detail4_1_, deterfassu0_.[Meldungs-ID] as Meldungs5_1_, deterfassu0_.ZeitStd as ZeitStd1_, deterfassu0_.Kommentar as Kommentar1_ from ZE_ENTW.dbo.DET_Erfassung deterfassu0_ where deterfassu0_.[WO-Zeiterf-ID]=? order by deterfassu0_.[WO-Zeiterf-ID] ASC, deterfassu0_.[Tag-ID] ASC
Name and version of the database you are using:MSSQL 2000, SP4
The generated SQL (show_sql=true):as seen in the stacktrace:
Code:
Hibernate: insert into ZE_ENTW.dbo.[MA-WO-Kalender] ([Wochen-ID], [Personal-ID], Erf_abgeschlossenJN, Monatsabschluss, Erf_abgeschlMonatJN, VerbuchtJN, Kontrolle_Login, Kontrolle_Datum, Kontrolle_Login_Monat, Kontrolle_Datum_Monat) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
Has anyone an idea, what the problem could be?
Thanks in advance, Patric