Strange Unique key or primary key violation

1,015 views
Skip to first unread message

Martin Dames

unread,
Feb 14, 2011, 2:47:00 AM2/14/11
to H2 Database
Hi all,

in our project we use JBoss Seam 2.1.2 with Hibernate 3.2.4.sp1, JPA
1, Richfaces 3.3.3 and h2-1.2.147. We have an upload page where the
user can provide some documents. The documents will be stored
elsewhere and we don't need to store the byte content in our H2
database. We just store some metadata like checksum, length, filename,
mimetype, fileextension and so on.

If the user provides more than two document with the same content but
different filenames we get a Unique key or primary key violation from
h2. This is very strange, because the only unqie id is the id
generated by hibernate/h2 in our entity. Nothing else will be the
unique key. We also tried to change the GenerationType to Sequence for
id generation to avoid concurrency problems if JPA stores the entity
asynchronous, but this didn't help. All other use cases (store 10 or
20 different files for example) are running fine.

Here are the relavant entity information and below that the exception
(unfort. parts in german):

@Entity
public class FileAtarrabi implements Serializable {
private static final long serialVersionUID = 1L;

@Id @GeneratedValue(strategy=GenerationType.SEQUENCE) private Long
id;
@Lob private byte[] data;
private long foreignId;
private String name;
private String mimetype;
private String fileExtension;
private Format fileFormat;
private Long length;
private String checksum;


public Long getId() {
return id;
}

public void setId(Long id) {
this.id = id;
}
...
}



@Entity
public class Quality implements Serializable {

private static final long serialVersionUID = 2233627552766430122L;

@Id @GeneratedValue private Long id;
...
@OneToMany(cascade = javax.persistence.CascadeType.ALL)
private List<FileAtarrabi> attachments = new
ArrayList<FileAtarrabi>();
...
}

Exceptions:

14:06:08,879 ERROR [Exceptions] handled and logged exception
java.lang.IllegalStateException: Could not commit transaction
at
org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:
625)
at
org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:
604)
at
org.jboss.seam.jsf.SeamPhaseListener.handleTransactionsAfterPhase(SeamPhaseListener.java:
345)
at
org.jboss.seam.jsf.SeamPhaseListener.afterServletPhase(SeamPhaseListener.java:
245)
at
org.jboss.seam.jsf.SeamPhaseListener.afterPhase(SeamPhaseListener.java:
196)
at com.sun.faces.lifecycle.Phase.handleAfterPhase(Phase.java:175)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:114)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:
118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:265)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
290)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:83)
at org.jboss.seam.web.IdentityFilter.doFilter(IdentityFilter.java:40)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.MultipartFilter.doFilter(MultipartFilter.java:
90)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.ExceptionFilter.doFilter(ExceptionFilter.java:
64)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.RedirectFilter.doFilter(RedirectFilter.java:45)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:
206)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at
org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:
388)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:515)
at org.jboss.seam.web.Ajax4jsfFilter.doFilter(Ajax4jsfFilter.java:56)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.LoggingFilter.doFilter(LoggingFilter.java:60)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.web.HotDeployFilter.doFilter(HotDeployFilter.java:
53)
at org.jboss.seam.servlet.SeamFilter
$FilterChainImpl.doFilter(SeamFilter.java:69)
at org.jboss.seam.servlet.SeamFilter.doFilter(SeamFilter.java:158)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
at
org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:
96)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:
235)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:
206)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:
230)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:
175)
at
org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:
182)
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:
432)
at
org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:
84)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:
127)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:
102)
at
org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:
157)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:
109)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:
262)
at
org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:
844)
at org.apache.coyote.http11.Http11Protocol
$Http11ConnectionHandler.process(Http11Protocol.java:583)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:
446)
at java.lang.Thread.run(Thread.java:662)
Caused by: javax.transaction.RollbackException:
[com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted]
[com.arjuna.ats.internal.jta.transaction.arjunacore.commitwhenaborted]
Can't commit because the transaction is in aborted state
at
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:
1401)
at
com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.commit(BaseTransaction.java:
135)
at
com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.commit(BaseTransactionManagerDelegate.java:
87)
at
org.jboss.tm.usertx.client.ServerVMClientUserTransaction.commit(ServerVMClientUserTransaction.java:
140)
at org.jboss.seam.transaction.UTTransaction.commit(UTTransaction.java:
52)
at
org.jboss.seam.jsf.SeamPhaseListener.commitOrRollback(SeamPhaseListener.java:
613)
... 49 more
Caused by: javax.persistence.EntityExistsException:
org.hibernate.exception.ConstraintViolationException: Could not
execute JDBC batch update
at
org.hibernate.ejb.AbstractEntityManagerImpl.throwPersistenceException(AbstractEntityManagerImpl.java:
604)
at org.hibernate.ejb.AbstractEntityManagerImpl
$1.beforeCompletion(AbstractEntityManagerImpl.java:524)
at
com.arjuna.ats.internal.jta.resources.arjunacore.SynchronizationImple.beforeCompletion(SynchronizationImple.java:
114)
at
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.beforeCompletion(TwoPhaseCoordinator.java:
247)
at
com.arjuna.ats.arjuna.coordinator.TwoPhaseCoordinator.end(TwoPhaseCoordinator.java:
86)
at com.arjuna.ats.arjuna.AtomicAction.commit(AtomicAction.java:177)
at
com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple.commitAndDisassociate(TransactionImple.java:
1389)
... 54 more
Caused by: org.hibernate.exception.ConstraintViolationException: Could
not execute JDBC batch update
at
org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:
71)
at
org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:
43)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:
253)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:
237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:
145)
at
org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:
298)
at
org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:
27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.ejb.AbstractEntityManagerImpl
$1.beforeCompletion(AbstractEntityManagerImpl.java:515)
... 59 more
Caused by: org.h2.jdbc.JdbcBatchUpdateException: Eindeutiger Index
oder Primarschlüssel verletzt: "CONSTRAINT_INDEX_8 ON
PUBLIC.QUALITY_FILEATARRABI(ATTACHMENTS_ID)"
Unique index or primary key violation: "CONSTRAINT_INDEX_8 ON
PUBLIC.QUALITY_FILEATARRABI(ATTACHMENTS_ID)"; SQL statement:
insert into Quality_FileAtarrabi (Quality_id, attachments_id) values
(?, ?) [23001-150]
at
org.h2.jdbc.JdbcPreparedStatement.executeBatch(JdbcPreparedStatement.java:
1110)
at
org.jboss.resource.adapter.jdbc.WrappedStatement.executeBatch(WrappedStatement.java:
774)
at
org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:
48)
at
org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:
246)
... 66 more

Thomas Mueller

unread,
Feb 16, 2011, 2:03:36 PM2/16/11
to h2-da...@googlegroups.com
Hi,

I don't think this is a bug in H2. It looks like there is a unique
constraint on the table QUALITY_FILEATARRABI / column ATTACHMENTS_ID,
which is violated (trying to insert two rows with the same
ATTACHMENTS_ID). I believe this could be a Hibernate configuration
problem, or an old version of the H2 Hibernate Adapter. However, I
don't know Hibernate very well... Could you post your Hibernate
configuration?

Regards,
Thomas

Reply all
Reply to author
Forward
0 new messages