1

Okay, i am very very very new to Hibernate/Spring. I had to upgrade existing code from Hibernate 2 - Hibernate 4 and Spring 1 - Spring 3.

I keep getting this exception when trying to call saveOrUpdate when passing more than one message to the database (it works fine when I only send one message):

  org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session
  at org.hibernate.engine.internal.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:686)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:293)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:239)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:109)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:728)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:720)
    at org.hibernate.engine.spi.CascadingAction$5.cascade(CascadingAction.java:258)
    at org.hibernate.engine.internal.Cascade.cascadeToOne(Cascade.java:380)
    at org.hibernate.engine.internal.Cascade.cascadeAssociation(Cascade.java:323)
    at org.hibernate.engine.internal.Cascade.cascadeProperty(Cascade.java:208)
    at org.hibernate.engine.internal.Cascade.cascade(Cascade.java:165)
    at org.hibernate.event.internal.AbstractSaveEventListener.cascadeBeforeSave(AbstractSaveEventListener.java:423)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:264)
    at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:193)
    at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:136)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.saveWithGeneratedOrRequestedId(DefaultSaveOrUpdateEventListener.java:204)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.entityIsTransient(DefaultSaveOrUpdateEventListener.java:189)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:114)
    at org.hibernate.event.internal.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:90)
    at org.hibernate.internal.SessionImpl.fireSaveOrUpdate(SessionImpl.java:728)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:720)
    at org.hibernate.internal.SessionImpl.saveOrUpdate(SessionImpl.java:716)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
    at $Proxy9.saveOrUpdate(Unknown Source)

I have googled till I am blue in the face! I have tried to use merge(). This does not give the exception, but merge inserts NULL values into the Database.

I have tried to use evict(), flush(), same error.

This is the method that causes the error:

public void saveOrUpdate(Object obj)  {
  Session session = null;
  SessionFactory sf = getSessionFactory();

  try {
        try {
            session = sf.getCurrentSession();
        } catch (Exception e) {
            session = sf.openSession();
        }

        System.out.println("Object: " + obj);

        session.beginTransaction();
        session.saveOrUpdate(obj);
        session.getTransaction().commit();

        System.out.println("DONE");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

Any help would be greatly appreciated!

Jonathan
  • 20,053
  • 6
  • 63
  • 70
lulu88
  • 1,694
  • 5
  • 27
  • 41

2 Answers2

0

Can you please provide the mappings and the code which calls the saveOrUpdate methods. It looks like the error is in the code which calls the saveOrUpdate

shashikanthb
  • 379
  • 2
  • 9
  • 21
  • This is it: `BulkmessageDAOIF bulkmessageDAO = DAOFactory.instance() .getBulkMessageDAO(); bulkmessageDAO.saveOrUpdate(reportBM);` I'll get the mappings as well – lulu88 Nov 20 '12 at 09:33
  • How is reportBM created? I mean how are the properties set on this object – shashikanthb Nov 20 '12 at 09:53
  • reportBM is an instance of the BulkMessage class with the values set. i printed the values and found that the is is 'null' - but some hibernate logging tells me it used a hibernate_sequence for that. – lulu88 Nov 20 '12 at 12:41
  • You are right. hibernate_sequence is used to generate the primary key for that entity/table. The primarykey column/property in your reportBPM class should be null if you want to insert and hibernate will generate the key using the sequence and then update the column. I would suggest you look at some hibernate examples. there are plenty of em available on the internet – shashikanthb Nov 22 '12 at 13:32
0

I solved it :)

I don't know if its the best solution, but it works for me and after 2 solid days of struggling I'm happy!

I removed Cascade from the parent object and explicitly called saveOrUpdate on parent and then on the children.

Thanks everyone for the help :)

lulu88
  • 1,694
  • 5
  • 27
  • 41