java - Spring JPA OneToOne FK 作为 PK Cascade.Remove

标签 java mysql spring hibernate spring-boot

我有两个表,ba:

  • 他们有一对一的双向关系
  • a 有一个到 b 的外键,它定义了这个关系
  • 这个外键也被认为是 a 和 JPA @ID
  • 的主键
  • 我想要一个级联删除,在删除 a 时删除相关的 b
  • 在 MySQL 中,ab_idNOT NULL

问题是,当我使用 JPA 存储库删除我的 A 对象时,我在其外键上得到一个 ConstraintViolationException。 我希望 ab 行都被删除(巧妙地从 a 的行开始)。

我要如何解决这个问题,我想保留:

  • 我的数据库架构相同
  • ab的级联移除
  • b id 是 a
  • 的 JPA @Id
CREATE TABLE `b` (
  `dbid` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`dbid`),
);

CREATE TABLE `a` (
  `b_id` int(11) NOT NULL,
  KEY `b_fk` (`b_id`),
  CONSTRAINT `b_fk` FOREIGN KEY (`b_id`) REFERENCES `b` (`dbid`),
);

@Entity
@Table(name = "a")
public class A {

    @Id
    @Column(name = "b_id")
    @GeneratedValue(generator = "gen")
    @GenericGenerator(name = "gen", strategy = "foreign", parameters = @Parameter(name="property", value="b"))
    private Integer bId;

    @OneToOne(cascade = CascadeType.REMOVE)
    @PrimaryKeyJoinColumn
    private B b;
}
@Entity
@Table(name = "b")
public class B {

    @Id
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    @Column(name = "dbid")
    private Integer id;

    @OneToOne(mappedBy = "b")
    private A a;
}

[编辑] 在回答评论和重新阅读我的问题的所有讨论之后,orphanRemoval 的提案确实在范围和工作范围内。

最佳答案

如果你想删除 B 的对象,只要相关联的 A 被删除(这是你的愿望 list 的第四点:

I want a cascade removal that deletes the related b when a is deleted

然后您需要将 A 中的映射更改为:

@OneToOne(cascade = CascadeType.REMOVE, orphanRemoval = true)
@PrimaryKeyJoinColumn
private B b;

关于java - Spring JPA OneToOne FK 作为 PK Cascade.Remove,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54267954/

相关文章:

java - 我们应该如何在 Java 中使用 vector ,就像在 C++ 中使用 vector 一样?

尝试从 Glassfish 获取 JMS 资源时出现 javax.naming.NoInitialContextException

java - 检测暗窗口任务栏

php - 按 DESC 和 ASC 对搜索结果进行排序

java - POSTed JSON 中的实体关系与 Spring Boot

java - 静态资源的编码问题

来自 MySQL 的 PHP 数组不为空但有一个空条目 - 如何避免

mysql - ssh端口从R转发到mysql

java - Spring hatoas jaxrslinkbuilder 添加空字段

java - 创建 PropertyPlaceHolderConfigurer 的多个实例 - Spring