【问题标题】:How can I set cascade delete when I create tables on MySQL with Spring Boot?使用 Spring Boot 在 MySQL 上创建表时如何设置级联删除?
【发布时间】:2020-09-08 04:32:53
【问题描述】:

我是 Spring Boot 新手。

目前,我需要在我即将为我的 Spring Boot 项目创建的表上设置 Cascade Delete 属性。

下面是我定义表“MESSAGE”的java代码。

“MESSAGE”表有两个外键(“Header”、“MessageBody”)

@Entity
@Data
@Table(name="MESSAGE")
public class LSportsMessage {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "MESSAGE_ID")
    private Long id;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "HEADER_ID")
    @JacksonXmlProperty(localName="Header")
    private Header header;

    @OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
    @JoinColumn(name = "BODY_ID")
    @JacksonXmlProperty(localName="MessageBody")
    private MessageBody messageBody;

    @Column(name = "IS_INPLAY")
    private Boolean isInplay = false;

    @Column(name = "IS_PREMATCH")
    private Boolean isPrematch = false;

}

数据库创建成功一半,因为当我运行 SHOW CREATE TABLE MESSAGE 时,会显示以下输出。

CREATE TABLE `message` (
  `message_id` bigint(20) NOT NULL,
  `is_inplay` bit(1) DEFAULT NULL,
  `is_prematch` bit(1) DEFAULT NULL,
  `header_id` bigint(20) DEFAULT NULL,
  `body_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`message_id`),
  KEY `FK10f5dp8hyhqi35fn83goqkxpk` (`header_id`),
  KEY `FK3dpoffc04evqxd8d2kieghiol` (`body_id`),
  CONSTRAINT `FK10f5dp8hyhqi35fn83goqkxpk` FOREIGN KEY (`header_id`) REFERENCES `header` (`header_id`),
  CONSTRAINT `FK3dpoffc04evqxd8d2kieghiol` FOREIGN KEY (`body_id`) REFERENCES `body` (`body_id`)
)

输出中没有提到级联删除。

我该如何解决这个问题?

当我删除表“Message”中的相应行时,我确实需要自动删除“Header”和“MessageBody”表中的行。

【问题讨论】:

    标签: mysql spring-boot


    【解决方案1】:
        @OneToOne(cascade = {CascadeType.REMOVE}, orphanRemoval = true)
        @JoinColumn(name = "HEADER_ID")
        @JacksonXmlProperty(localName="Header")
        private Header header;
    

    您可以有多个级联条件,包括 全部 |坚持 |合并 |删除 |刷新 |分离

    此外,hibernate 特别支持的 Hibernate Cascade 选项:

    复制 |保存更新 |锁定

    【讨论】:

    • 我的代码已经包含 REMOVE 属性,因为我声明了 CascadeType.ALL。不是吗?
    • CacadeType.ALL 包括 CacadeType.REMOVE 和 CacadeType.DETACH,因此选择特定会有所帮助。
    猜你喜欢
    • 2018-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 2019-10-19
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    相关资源
    最近更新 更多