我正在使用Spring Boot和hibernate 5.0.11.Final
我有以下奇怪的问题。如果我定义像这样的双向映射
@Data
@Entity
public class Device {
@OneToMany(mappedBy = "device")
private Collection<Container> containers = new ArrayList<>();
}
@Data
@Entity
public class Container {
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private Device device;
}
容器表上的外键约束不会使用ON DELETE CASCADE
创建,因此删除设备不会删除其容器。
如果我按照这样的方向进行单向映射
@Data
@Entity
public class Device {
}
@Data
@Entity
public class Container {
@ManyToOne
@OnDelete(action = OnDeleteAction.CASCADE)
private Device device;
}
约束按预期生成ON DELETE CASCADE
设置。
如果我使用@Cascade(CascadeType.DELETE)
在设备端设置级联并删除@OnDelete
级联工作但在休眠方面没有数据库中的物理约束。
我做错了吗?我应该仅在单向映射中使用@OnDelete
吗?这是一个错误吗?
此致 大卫
答案 0 :(得分:5)
我遇到了类似的问题,经过一段时间的试用和调试后,我发现了一些不明显的事情:当你构建双向关系时,很多方面默默地< / strong>重写一个方面的约束。因此,你应该在另一边指定 OnDelete ,如下所示:
@Data
@Entity
public class Device {
@OneToMany(mappedBy = "device")
@OnDelete(action = OnDeleteAction.CASCADE)
private Collection<Container> containers = new ArrayList<>();
}
@Data
@Entity
public class Container {
@ManyToOne
private Device device;
}