我正在使用 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
级联工作但在 hibernate 端没有物理限制在数据库中。
我做错了什么吗?我应该只在单向映射中使用 @OnDelete
吗?这是错误吗?
问候 大卫
最佳答案
我遇到了类似的问题,经过一段时间的尝试和调试后,我发现了一些不太明显的事情:当你建立双向关系时,many 端静默 在 one 侧重写约束。因此,您应该像这样在另一侧指定 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;
}
关于java - @OnDelete(CASCADE) 不适用于双向映射( hibernate ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42108715/