java - @OnDelete(CASCADE) 不适用于双向映射( hibernate )

标签 java hibernate spring-boot

我正在使用 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/

相关文章:

java - 巨大的 XML 文件 : Do I read a "page" and process it each time?

java - hibernate 映射异常 : Logical column name cannot be null

mysql - 如何获取收藏<?从 QueryDsl 中的 BooleanExpession 扩展 Long>

java - 属性 "Year"的冲突 setter 定义 (Springfox-Swagger2)

java - 我们应该测试 getForObject 吗?

IBM Websphere 中的 Java 7.1

java - 如何找出当前具有焦点的对象

java - 父级有子级列表或子级有父级引用

java - 用于覆盖 XML 定义的 Bean 注释 - Spring

作为函数参数传递的 Java 对象