@OnDelete(CASCADE)没有进行双向映射(休眠)

时间:2017-02-08 09:02:43

标签: 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级联工作但在休眠方面没有数据库中的物理约束。

我做错了吗?我应该仅在单向映射中使用@OnDelete吗?这是一个错误吗?

此致 大卫

1 个答案:

答案 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;

}