Hibernate @OnDelete(action = OnDeleteAction.CASCADE)无效

时间:2017-10-16 21:09:14

标签: java hibernate jpa

我有ManyToOne映射,我希望在删除Parent后删除所有子元素。我看到了一个here的解决方案,并且知道没有必要有双向关系来实现这样的逻辑,但它在我的情况下不起作用。

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

以下是我的父类

@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

我的删除代码

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

上面的代码删除了Order(父级),但没有删除子元素。

我的hibernate-cfg.file

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

这里可能有什么问题?

1 个答案:

答案 0 :(得分:1)

我发现了错误。我依靠Hibernate在创建表时创建级联关系,这种情况并没有发生。我必须通过指定

手动创建表
   `FOREIGN KEY (order_order_number) REFERENCES orders (order_number)
   ON DELETE CASCADE
   ON UPDATE CASCADE`

在MySql中创建子订单表时。在此之后它开始工作。

<强>更新 或者,当您修改任何实体时,最好使用'hbm2ddl.auto=create',以便hibernate删除现有实体并创建一个包含更新约束的全新表。