Hello,
I am having a ConstraintViolationException when attempting to insert a list of transient object. I read through an XML file and builds a collection of objects that I wish to save later. The object is simple and very strait forward with no relation with any other table. The primary key is being generated by a UUID generator so I really don't see any duplicate.
I tried every options in my hand, including using a set rather than list. Printed out each object before saving to see their state, turned out hibernate sql statement for debug, notthing points me to a solution.
I also tried session.save(), or session.saveOrUpdate().
As you can see this is a fairly simple problem. Yet I can't find out whats wrong. Any help will be appreciated. Mapping file, and java code are given below.
Thanks,
Nemo
04/20 16:02:16,335 [MessageListenerThreadPool : 3] PublishingNovusDocMigration ERROR TargetServiceBean: HibernateException occurred when trying to flush session.
org.hibernate.exception.ConstraintViolationException: could not insert: [myObjHib]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java(Compiled Code))
at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java(Compiled Code))
at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java(Compiled Code))
at org.hibernate.engine.ActionQueue.execute(ActionQueue.java(Inlined Compiled Code))
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java(Compiled Code))
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java(Compiled Code))
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java(Inlined Compiled Code))
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java(Inlined Compiled Code))
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java(Compiled Code))
at utilities.hibernate.HibernateUtilImpl.flushSession(HibernateUtilImpl.java(Compiled Code))
at services.target.ejb.TargetServiceBean.findTargetContent(TargetServiceBean.java(Compiled Code))
at services.target.ejb.TargetServiceBean.findTargetContent(TargetServiceBean.java(Inlined Compiled Code))
at services.target.ejb.EJSLocalStatelessTargetService_5e61c602.findTargetContent(Unknown Source)
at services.target.TargetServiceDelegate.findTargetContent(TargetServiceDelegate.java(Compiled Code))
at services.ServiceRequestDelegateImpl.process(ServiceRequestDelegateImpl.java:42)
at services.ejb.ServiceRequestDelegateBean.process(ServiceRequestDelegateBean.java:48)
at services.ejb.ServiceRequestDelegateBean.process(ServiceRequestDelegateBean.java:93)
at services.ejb.EJSLocalStatelessServiceRequestDelegate_8a8c7cb6.process(Unknown Source)
at services.ServiceRequestDelegateDelegate.process(ServiceRequestDelegateDelegate.java:62)
at services.ejb.AbstractServiceMDBean.processServiceRequest(AbstractServiceMDBean.java:421)
at services.ejb.ServiceMDBean.callService(ServiceMDBean.java:234)
at services.ejb.ServiceMDBean.onMessage(ServiceMDBean.java:203)
at com.ibm.ejs.jms.listener.MDBWrapper$PriviledgedOnMessage.run(MDBWrapper.java:211)
at com.ibm.ws.security.util.AccessController.doPrivileged(AccessController.java(Compiled Code))
at com.ibm.ejs.jms.listener.MDBWrapper.callOnMessage(MDBWrapper.java:200)
at com.ibm.ejs.jms.listener.MDBWrapper.onMessage(MDBWrapper.java:178)
at com.ibm.mq.jms.MQSession.run(MQSession.java(Compiled Code))
at com.ibm.ejs.jms.JMSSessionHandle.run(JMSSessionHandle.java(Compiled Code))
at com.ibm.ejs.jms.listener.ServerSession.connectionConsumerOnMessage(ServerSession.java(Compiled Code))
at com.ibm.ejs.jms.listener.ServerSession.onMessage(ServerSession.java(Compiled Code))
at com.ibm.ejs.jms.listener.ServerSession.dispatch(ServerSession.java(Inlined Compiled Code))
at sun.reflect.GeneratedMethodAccessor82.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java(Compiled Code))
at java.lang.reflect.Method.invoke(Method.java(Compiled Code))
at com.ibm.ejs.jms.listener.ServerSessionDispatcher.dispatch(ServerSessionDispatcher.java(Compiled Code))
at com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java(Compiled Code))
at com.ibm.ejs.container.MDBWrapper.onMessage(MDBWrapper.java(Compiled Code))
at com.ibm.ejs.jms.listener.ServerSession.run(ServerSession.java(Compiled Code))
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java(Compiled Code))
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (CODES.PK_WLNV_MINED_NOD_LINK) violated
at oracle.jdbc.dbaccess.DBError.throwBatchUpdateException(DBError.java:459)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java(Compiled Code))
at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.pmiExecuteBatch(WSJdbcStatement.java(Compiled Code))
at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.executeBatch(WSJdbcStatement.java(Compiled Code))
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java(Compiled Code))
at org.hibernate.jdbc.BatchingBatcher.addToBatch(BatchingBatcher.java(Compiled Code))
... 52 more
Here is the mapping file:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="x.y.z.hib">
<class mutable="true" name="x.y.z.hib.myObjHib" table="WLNV_MINED_NOD_LINK">
<meta attribute="scope-class">public</meta>
<meta attribute="implement-equals">true</meta>
<id name="uuid" column="UUID" type="x.y.z.utilities.hibernate.UuidUserType">
<meta attribute="property-type">x.y.z.utilities.Uuid</meta>
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
<generator class="x.y.z.utilities.hibernate.UuidGenerator" />
</id>
<property name="jobId" column="JOB_ID" not-null="true" type="x.y.z.utilities.hibernate.UuidUserType">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="documentUuid" column="DOC_ID" not-null="true" type="x.y.z.utilities.hibernate.UuidUserType">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="blockUuid" column="BLOCK_UUID" not-null="true" type="x.y.z.utilities.hibernate.UuidUserType">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="blockMnem" column="BLOCK_MNEM" type="string" not-null="true">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="blockLabelDesignator" column="BLOCK_LABEL_DESIGNATOR" type="string">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="blockMnemOrder" column="BLOCK_MNEM_ORDER" type="integer" not-null="true">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="ksBlockLevel" column="KS_BLOCK_LEVEL" type="integer">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="runheadParaId" column="RUNHEAD_PARA_ID" type="string">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
<property name="nodBlockIndex" column="NOD_BLOCK_INDEX" type="integer" not-null="true">
<meta attribute="use-in-tostring">true</meta>
<meta attribute="use-in-equals">true</meta>
</property>
</class>
</hibernate-mapping>
private void startBlock(String blockUuid)
{
block = new myObjHib();
block.setJobId(getCodesContext().getJobid());
block.setDocumentUuid(docUuid);
block.setBlockUuid(Uuid.getInstance(blockUuid));
block.setNodBlockIndex(new Integer(nodBlockIndex));
...
// I set the other varialbes later, and add block to the java list blocks.
}
And, here is the java code that actually iterates through the list and save each object one at a time.
public void endDocument() throws SAXException
{
myObjHib h = null;
try
{
Session s = HIBERNATE_UTIL.getSession();
for (Iterator i = blocks.iterator(); i.hasNext();)
{
System.out.println(++counter);
h = (myObjHib) i.next();
s.save(h);
Log.debug("myObjHib: " + h + "\n");
}
s.flush();
}
catch (Exception e)
{
String msg = "my error message";
LOG.error(msg, e);
throw new RuntimeException(msg, e);
}
super.endDocument();
}
|