[hibernate-issues] [Hibernate-JIRA] Commented: (HHH-1268) Unidirection OneToMany causes duplicate key entry violation when removing from list

Douglas Ferguson (JIRA) noreply at atlassian.com
Mon Jun 13 16:46:27 EDT 2011


    [ http://opensource.atlassian.com/projects/hibernate/browse/HHH-1268?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=42577#action_42577 ] 

Douglas Ferguson commented on HHH-1268:
---------------------------------------

The proposed patch does not work. It generates bad sql.

We have been experiencing this problem and have gotten pretty close to resolving it. We have found that in CollectionUpdateAction there is an if statement that checks to see if the persistent collection "needsRecreate" which should be true for OneToMany, but as we run through the debugger we found that even though we have a @OneToMany annotation, it has "ManyToOne" at runtime. 

Which means that instead of CollectionUpdateAction running "created" it runs "delete, update, insert" which blows up because of FK constraints.

The only place that seems to be setting ManyToOne is in CollectionBinder but the code gets a bit squirley, does anybody know this section well and why it would be flipping the annotation around?


		if ( isCollectionOfEntities ) {
			element =
					new ManyToOne( mappings,  collValue.getCollectionTable() );
			collValue.setElement( element );
			element.setReferencedEntityName( collType.getName() );


> Unidirection OneToMany causes duplicate key entry violation when removing from list
> -----------------------------------------------------------------------------------
>
>                 Key: HHH-1268
>                 URL: http://opensource.atlassian.com/projects/hibernate/browse/HHH-1268
>             Project: Hibernate Core
>          Issue Type: Bug
>    Affects Versions: 3.1, 3.5.6, 3.6.0
>         Environment: 3.1 final
> MySql 4.1.14 using MYISAM tables
>            Reporter: Rex Madden
>            Assignee: Gail Badner
>             Fix For: 3.2.x, 3.3.x, 3.6.6, 4.0.0.next
>
>         Attachments: possible_solution.patch, src.zip
>
>
> Simple OneToMany parent/child relationship using the default table structure (2 tables and a join table)
> Add 3 children to the parent.  Flush.  Remove the first child.  Flush throws error:
> Exception in thread "main" org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
> 	at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:69)
> 	at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
> 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:202)
> 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:230)
> 	at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:143)
> 	at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:296)
> 	at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
> 	at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:980)
> 	at UnidirectionalOneToManyRemoveFromListBug.main(UnidirectionalOneToManyRemoveFromListBug.java:27)
> 	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:585)
> 	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:86)
> Caused by: java.sql.BatchUpdateException: Duplicate key or integrity constraint violation,  message from server: "Duplicate entry '5' for key 2"
> 	at com.mysql.jdbc.PreparedStatement.executeBatch(PreparedStatement.java:1461)
> 	at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
> 	at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
> 	... 11 more
> The problem is that there is a unique key on the relationship table that gets violated.  The session removes the last row in the relationship table, then attempts to rewrite the child_id's.  It fails since there is a uniqueness constraint on that column.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://opensource.atlassian.com/projects/hibernate/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        


More information about the hibernate-issues mailing list