我有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>
这里可能有什么问题?
答案 0 :(得分:1)
我发现了错误。我依靠Hibernate在创建表时创建级联关系,这种情况并没有发生。我必须通过指定
手动创建表 `FOREIGN KEY (order_order_number) REFERENCES orders (order_number)
ON DELETE CASCADE
ON UPDATE CASCADE`
在MySql中创建子订单表时。在此之后它开始工作。
<强>更新强>
或者,当您修改任何实体时,最好使用'hbm2ddl.auto=create'
,以便hibernate删除现有实体并创建一个包含更新约束的全新表。