These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 
Author Message
 Post subject: Hibernate performs INSERT instead of UPDATE
PostPosted: Wed Feb 07, 2007 5:56 am 
Newbie

Joined: Tue Feb 06, 2007 12:08 pm
Posts: 5
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


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 07, 2007 9:33 am 
Newbie

Joined: Tue Feb 06, 2007 12:08 pm
Posts: 5
... I've seen now, that when I use:

Code:
kalenderDAO.attachDirty(week);


instead of:

Code:
kalenderDAO.save(week);



it works, it throws no exception.... I can live with that, but it would be nice when I knew why this happens this way.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 07, 2007 11:19 am 
Newbie

Joined: Tue Nov 22, 2005 10:01 am
Posts: 7
Not Sure what type of an Object kalenderDAO is I guess MaWoKalenderDAO is some class that implements Session. If so it should have a saveOrUpdate method. use kalenderDAO.saveOrUpdate(week) instead of the save method. If this works let me know and please rate my post as useful. Thanks.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Feb 07, 2007 11:53 am 
Newbie

Joined: Tue Feb 06, 2007 12:08 pm
Posts: 5
thanks for your reply.

well, here is some snippet of the Class MaWoKalenderDAO so it should you an idea what it is or does:

Code:
public class MaWoKalenderDAO extends BaseHibernateDAO {

   private static final Log log = LogFactory.getLog(MaWoKalenderDAO.class);

   // property constants
   public static final String WOCHEN_ID = "wochenId";

   public static final String PERSONAL_ID = "personalId";

   public static final String ERF_ABGESCHLOSSEN_JN = "erfAbgeschlossenJn";

   public static final String MONATSABSCHLUSS = "monatsabschluss";

   public static final String ERF_ABGESCHL_MONAT_JN = "erfAbgeschlMonatJn";

   public static final String VERBUCHT_JN = "verbuchtJn";

   public static final String KONTROLLE_LOGIN = "kontrolleLogin";

   public static final String KONTROLLE_LOGIN_MONAT = "kontrolleLoginMonat";

   public void save(MaWoKalender transientInstance) {
      log.debug("saving MaWoKalender instance");
      try {
         getSession().save(transientInstance);
         log.debug("save successful");
      } catch (RuntimeException re) {
         log.error("save failed", re);
         throw re;
      }
   }
...


I tried your suggestion, but as I've seen it won't work. (And I've tested it anyway, and it didn't work). But thanks for your help.

The problem is, when I implement "Session" (I used org.hibernate.Session) and implement the methods it gives me just the method-header with no body (as it should do, since Session is an Interface).. so there's no code that could save my data... but anyway, I think I leave it that way, it works with attachDirty. Thanks for your help.


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 4 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.