Hibernate ORM
  1. Hibernate ORM
  2. HHH-8476

Bulk delete doesn't cascade delete on join table

    Details

    • Type: Improvement Improvement
    • Status: Closed
    • Priority: Major Major
    • Resolution: Fixed
    • Affects Version/s: 4.2.5
    • Fix Version/s: 4.2.6, 4.3.0.Beta5
    • Component/s: core
    • Labels:
      None
    • Environment:
      Hibernate 4.2.5.Final, Firebird, Tomcat 7, jdk 1.7, Windows 7
    • Last commented by a user?:
      true

      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=:param_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.

      1. Cat.hbm.xml
        0.7 kB
        Aurelien DROUARD
      2. Cat.java
        0.6 kB
        Aurelien DROUARD
      3. Person.hbm.xml
        0.5 kB
        Aurelien DROUARD
      4. Person.java
        0.4 kB
        Aurelien DROUARD

        Issue Links

          Activity

          Hide
          Aurelien DROUARD added a comment -

          Yes Brett, that's exactly the problem.

          Show
          Aurelien DROUARD added a comment - Yes Brett, that's exactly the problem.
          Hide
          Brett Meyer added a comment -

          Made it a PR – appreciate reviews before I push:

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

          Show
          Brett Meyer added a comment - Made it a PR – appreciate reviews before I push: https://github.com/hibernate/hibernate-orm/pull/599
          Hide
          Aurelien DROUARD added a comment -

          Brett, will you push the fix before 4.2.6 release ?

          Show
          Aurelien DROUARD added a comment - Brett, will you push the fix before 4.2.6 release ?
          Hide
          Brett Meyer added a comment -

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

          Show
          Brett Meyer added a comment - Aurelien DROUARD , yes, definitely. Just wanted a few eyes on the commit first.
          Hide
          Aurelien DROUARD added a comment -

          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=:param_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"

          Show
          Aurelien DROUARD added a comment - 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=:param_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"

            People

            • Votes:
              0 Vote for this issue
              Watchers:
              4 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved:

                Development