Bulk delete doesn't cascade delete on join table

Description

HQL delete doesn't cascade delete on join table.

Person bob = new Person();
bob.setId(1l);
bob.setFirstname("bob");
getCurrentSession().save(bob);

Cat felix = new Cat();
felix.setId(1l);
felix.setName("felix");
Set<Person> owners = new HashSet<Person>();
owners.add(bob);
felix.setOwners(owners);
getCurrentSession().save(felix);

Query query = getCurrentSession().createQuery("delete com.company.product.domain.Cat c where c.id=aram_id)");
query.setParameter("param_id", 1l);
return query.executeUpdate();

insert into PERSON (FIRSTNAME, ID) values (?, ?)
insert into CAT (NAME, ID) values (?, ?)
insert into CAT_PERSON (ID_CAT, ID_PERSON) values (?, ?)
delete from CAT where ID=?

-> ConstraintViolationException: could not execute statement
violation of FOREIGN KEY constraint "FK_3QS4XQHEUL1KIQILV53S1F0GB" on table "CAT_PERSON"

Note that if Cat extends Animal with joined-subclass mapping everything is OK.

Attachments

4

Activity

Show:

Aurelien DROUARD September 26, 2013 at 1:22 PM

Hello,
In 4.2.6.Final release the delete from CAT_PERSON is now ok. Thanks Brett.
But I've got anohter problem with "map" mapping.
Could you handle this case ?

Cat.hbm.xml :
...
<map name="map" table="MAP">
<key column="CAT_KEY" />
<map-key type="java.lang.Integer">
<column name="MAP_KEY" />
</map-key>
<element column="MAP_VALUE" type="java.lang.Integer" />
</map>
...
Cat.java :
public class Cat
{
...
private Map<Integer, Integer> map;
...

Java test :
Person bob = new Person();
bob.setId(1l);
bob.setFirstname("bob");
getCurrentSession().save(bob);

Cat felix = new Cat();
felix.setId(1l);
felix.setName("felix");
Set<Person> owners = new HashSet<Person>();
owners.add(bob);
felix.setOwners(owners);

felix.setMap(new HashMap<Integer, Integer>());
felix.getMap().put(1, 10);
felix.getMap().put(2, 10);
felix.getMap().put(3, 15);
felix.getMap().put(4, 20);

getCurrentSession().save(felix);

Query query = getCurrentSession().createQuery("delete com.company.product.domain.Cat c where c.id=aram_id)");
query.setParameter("param_id", 1l);
query.executeUpdate();

Generated SQL:
insert into PERSON (FIRSTNAME, ID) values (?, ?)
insert into CAT (NAME, ID) values (?, ?)
insert into CAT_PERSON (ID_CAT, ID_PERSON) values (?, ?)
insert into MAP (CAT_KEY, MAP_KEY, MAP_VALUE) values (?, ?, ?)
insert into MAP (CAT_KEY, MAP_KEY, MAP_VALUE) values (?, ?, ?)
insert into MAP (CAT_KEY, MAP_KEY, MAP_VALUE) values (?, ?, ?)
insert into MAP (CAT_KEY, MAP_KEY, MAP_VALUE) values (?, ?, ?)
delete from CAT_PERSON where (ID_CAT) in (select ID from CAT where ID=?)
delete from CAT where ID=?

-> ConstraintViolationException: could not execute statement
violation of FOREIGN KEY constraint "FK_DX9BH52S5F00VYW30I1M8F0FM" on table "MAP"

Brett Meyer September 24, 2013 at 1:53 PM

, yes, definitely. Just wanted a few eyes on the commit first.

Aurelien DROUARD September 24, 2013 at 7:16 AM

Brett, will you push the fix before 4.2.6 release ?

Brett Meyer September 17, 2013 at 7:05 PM

Made it a PR – appreciate reviews before I push:

https://github.com/hibernate/hibernate-orm/pull/599

Aurelien DROUARD September 13, 2013 at 8:16 AM

Yes Brett, that's exactly the problem.

Fixed

Details

Assignee

Reporter

Components

Fix versions

Priority

Created September 9, 2013 at 4:06 PM
Updated November 18, 2013 at 10:45 PM
Resolved September 24, 2013 at 10:47 PM