Cascade remove works fine when using s.delete(object), but not when using s.createQuery("delete from class...").executeUpdate().
Hibernate version:
Hibernate 3.2 cr2
Hibernate Annotations 3.2.0.CR1
Mapping documents:
None, used annotations only
Code between sessionFactory.openSession() and session.close():
Code:
Transaction tx = s.beginTransaction();
Address address = new Address();
address.setStreetName("Privet Drive");
address.setStreetNumber("4");
Person person = new Person();
person.setName("Harry Potter");
person.setAddress(address);
s.save(person); // should also save address
s.flush();
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
int retval = s.createQuery(
"delete from " + Person.class.getName() + " where id=?"
).setParameters(
new Object[] {person.getId()}, new Type[] { Hibernate.LONG }
).executeUpdate();
tx.commit();
Full stack trace of any exception that occurs:No exception occurs, object is not removed from database.
Name and version of the database you are using:HSQL Database Engine, version: 1.7.2
The generated SQL (show_sql=true):Hibernate: insert into Address (id, state, streetNumber, streetName, city, zip) values (null, ?, ?, ?, ?, ?)
Hibernate: call identity()
Hibernate: insert into Person (id, address_id_fk, name) values (null, ?, ?)
Hibernate: call identity()
Hibernate: select person0_.id as id0_1_, person0_.address_id_fk as address3_0_1_, person0_.name as name0_1_, address1_.id as id1_0_, address1_.state as state1_0_, address1_.streetNumber as streetNu3_1_0_, address1_.streetName as streetName1_0_, address1_.city as city1_0_, address1_.zip as zip1_0_ from Person person0_ left outer join Address address1_ on person0_.address_id_fk=address1_.id where person0_.id=?
Hibernate: insert into Address (id, state, streetNumber, streetName, city, zip) values (null, ?, ?, ?, ?, ?)
Hibernate: call identity()
Hibernate: insert into Person (id, address_id_fk, name) values (null, ?, ?)
Hibernate: call identity()
Hibernate: delete from Person where id=?
Hibernate: delete from Address where id=?
Hibernate: select address0_.id as id1_0_, address0_.state as state1_0_, address0_.streetNumber as streetNu3_1_0_, address0_.streetName as streetName1_0_, address0_.city as city1_0_, address0_.zip as zip1_0_ from Address address0_ where address0_.id=?
Hibernate: insert into Address (id, state, streetNumber, streetName, city, zip) values (null, ?, ?, ?, ?, ?)
Hibernate: call identity()
Hibernate: insert into Person (id, address_id_fk, name) values (null, ?, ?)
Hibernate: call identity()
2006-06-22 16:03:22,805 2235 [main] WARN org.hibernate.hql.ast.tree.FromElementType - Using non-qualified column reference [id -> ([id])]
Hibernate: delete from Person where id=?
Hibernate: select person0_.id as id0_1_, person0_.address_id_fk as address3_0_1_, person0_.name as name0_1_, address1_.id as id1_0_, address1_.state as state1_0_, address1_.streetNumber as streetNu3_1_0_, address1_.streetName as streetName1_0_, address1_.city as city1_0_, address1_.zip as zip1_0_ from Person person0_ left outer join Address address1_ on person0_.address_id_fk=address1_.id where person0_.id=?
Hibernate: select address0_.id as id1_0_, address0_.state as state1_0_, address0_.streetNumber as streetNu3_1_0_, address0_.streetName as streetName1_0_, address0_.city as city1_0_, address0_.zip as zip1_0_ from Address address0_ where address0_.id=?
JUnit test case derived from hibernate-annotations-3.2.0.CR1/test/org/hibernate/test/annotations/TestCase.java:Code:
public void testCascadeRemoveViaQuery() {
Session s = openSession();
Transaction tx = s.beginTransaction();
Address address = new Address();
address.setStreetName("Privet Drive");
address.setStreetNumber("4");
Person person = new Person();
person.setName("Harry Potter");
person.setAddress(address);
s.save(person); // should also save address
s.flush();
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
int retval = s.createQuery(
"delete from " + Person.class.getName() + " where id=?"
).setParameters(
new Object[] {person.getId()}, new Type[] { Hibernate.LONG }
).executeUpdate();
tx.commit();
s.close();
s = openSession();
tx = s.beginTransaction();
person = (Person )s.get(Person.class, person.getId());
assertNull("person should have been deleted", person);
address = (Address )s.get(Address.class, address.getId());
assertNull("address should have been deleted", address);
tx.commit();
s.close();
}
public Class[] getMappings() {
return new Class[]{
Person.class,
Address.class
};
}
@Entity
public class Person extends Object implements Serializable {
/**
* Holds value of property name.
*/
private String name;
/**
* Getter for property name.
* @return Value of property name.
*/
public String getName() {
return this.name;
}
/**
* Setter for property name.
* @param name New value of property name.
*/
public void setName(String name) {
this.name = name;
}
/**
* Holds value of property address.
*/
private Address address;
/**
* Getter for property address.
* @return Value of property address.
*/
@OneToOne(cascade=CascadeType.ALL) @JoinColumn(name="address_id_fk")
public Address getAddress() {
return this.address;
}
/**
* Setter for property address.
* @param address New value of property address.
*/
public void setAddress(Address address) {
this.address = address;
}
/**
* Holds value of property id.
*/
private Long id;
/**
* Getter for property id.
* @return Value of property id.
*/
@Id
@GeneratedValue
public Long getId() {
return this.id;
}
/**
* Setter for property id.
* @param id New value of property id.
*/
public void setId(Long id) {
this.id = id;
}
}
@Entity
public class Address extends Object implements Serializable {
/**
* Holds value of property streetNumber.
*/
private String streetNumber;
/**
* Getter for property streetNumber.
* @return Value of property streetNumber.
*/
public String getStreetNumber() {
return this.streetNumber;
}
/**
* Setter for property streetNumber.
* @param streetNumber New value of property streetNumber.
*/
public void setStreetNumber(String streetNumber) {
this.streetNumber = streetNumber;
}
/**
* Holds value of property streetName.
*/
private String streetName;
/**
* Getter for property streetName.
* @return Value of property streetName.
*/
public String getStreetName() {
return this.streetName;
}
/**
* Setter for property streetName.
* @param streetName New value of property streetName.
*/
public void setStreetName(String streetName) {
this.streetName = streetName;
}
/**
* Holds value of property city.
*/
private String city;
/**
* Getter for property city.
* @return Value of property city.
*/
public String getCity() {
return this.city;
}
/**
* Setter for property city.
* @param city New value of property city.
*/
public void setCity(String city) {
this.city = city;
}
/**
* Holds value of property state.
*/
private String state;
/**
* Getter for property state.
* @return Value of property state.
*/
public String getState() {
return this.state;
}
/**
* Setter for property state.
* @param state New value of property state.
*/
public void setState(String state) {
this.state = state;
}
/**
* Holds value of property zip.
*/
private int zip;
/**
* Getter for property zip.
* @return Value of property zip.
*/
public int getZip() {
return this.zip;
}
/**
* Setter for property zip.
* @param zip New value of property zip.
*/
public void setZip(int zip) {
this.zip = zip;
}
/**
* Holds value of property id.
*/
private Long id;
/**
* Getter for property id.
* @return Value of property id.
*/
@Id
@GeneratedValue
public Long getId() {
return this.id;
}
/**
* Setter for property id.
* @param id New value of property id.
*/
public void setId(Long id) {
this.id = id;
}
}