PersistentList.getDeletes issue when used with @OneToMany and @IndexColumn
--------------------------------------------------------------------------
Key: HHH-3158
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-3158
Project: Hibernate3
Issue Type: Bug
Affects Versions: 3.2.2
Reporter: Hao Chen
I have the following scenario:
class Parent {
@OneToMany(cascade={CascadeType.ALL})
@IndexColumn(name="position", base=1)
private List<Children> children;
}
And I am getting MySQL constraint error:
com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Duplicate entry
'332' for key 2
The reason for the exception is that Hibernate generated association table has:
table parent_children:
parent_id
children_id unique --- this causes duplicate key error
position
I have tracked this down, and it looks like PersistentList.getDeletes is not returning the
correct index to be deleted:
suppose: oldChildren siize is 3 and the association table is:
parent_id=1, children_id=1, position=1;
parent_id=1, children_id=2, position=2;
parent_id=1, children_id=3, position=3;
now I delete the first child: because getDeletes only use size to decide which one in
the list to be deleted, it will return {2} because it assumes the last item is deleted.
so, the 3rd child is deleted from the association table. There is still two rows in
the association table:
parent_id=1, children_id=1, position=1;
parent_id=1, children_id=2, position=2;
now, because child 2 is at position 1 now, Hibernate try to update position=1 to:
parent_id=1, children_id=2, but children_id already exists at row 2. Thus the
MySQLIntegrityConstraintViolationException is throw.
I think the PersistentList.getDeletes should do the same thing as
PersistentBag.getDeletes, which compare each element in the list to the snapshot list to
decide which elements to delete.
--
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....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira