Mohit Bhagat
Mohit Bhagat

Reputation: 253

Hibernate @OnDelete(action = OnDeleteAction.CASCADE) not working

I have ManyToOne mapping and I wish to delete all the child elements upon deletion of Parent. I saw a solution over here and came to know that it is not necessary to have bi-directional relation to achieve such logic but it is not working in my case.

import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType; 
import org.hibernate.annotations.OnDelete;
import org.hibernate.annotations.OnDeleteAction;

@Entity
@Table(name="SubOrder")
public class SubOrder {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="order_seq")
@SequenceGenerator(name = "order_seq", initialValue=1000000000, allocationSize=1, sequenceName="order_auto_seq" )
@Column(name="sub_order_id")
private long subOrder;

@Column(name="product_name" , length=50)
private String productName;

@Column(name="Date")
private String date;

@ManyToOne()
@Cascade({CascadeType.PERSIST})
@OnDelete(action = OnDeleteAction.CASCADE)
private Order order;

public Order getOrder() {
    return order;
}

//Getters and setters

Below is my parent class

@Entity
@Table(name="Orders")
public class Order {

@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="order_seq")
@SequenceGenerator(name = "order_seq", initialValue=1000000000, allocationSize=1, sequenceName="order_auto_seq" )
@Column(name="order_number")
private long orderNumber;

@Temporal(TemporalType.TIMESTAMP)
@Column(name="Order_date")
private Date date= new Date();

//Getters and setters

My deletion code

Order result =session.get(Order.class, 1000000000l);
session.delete(result);

The above code deletes Order(parent) but not child elements.

My hibernate-cfg.file

<property name="hbm2ddl.auto">update</property>

What could be wrong here ?

Upvotes: 4

Views: 4439

Answers (1)

Mohit Bhagat
Mohit Bhagat

Reputation: 253

I found out the mistake. I was relying on Hibernate to create cascading relationship while creating tables, which was not happening. I had to manually create table by specifying

   `FOREIGN KEY (order_order_number) REFERENCES orders (order_number)
   ON DELETE CASCADE
   ON UPDATE CASCADE`

while creating suborder table in MySql. After this it started working.

Update Or when you modify any entity better use 'hbm2ddl.auto=create' so that hibernate delete existing one and create a fresh new table with updated constraints.

Upvotes: 1

Related Questions