我有两个表,b
和 a
:
- 他们有一对一的双向关系
a
有一个到b
的外键,它定义了这个关系- 这个外键也被认为是
a
和 JPA@ID
的主键
- 我想要一个级联删除,在删除
a
时删除相关的b
- 在 MySQL 中,
a
的b_id
是NOT NULL
问题是,当我使用 JPA 存储库删除我的 A
对象时,我在其外键上得到一个 ConstraintViolationException
。
我希望 a
和 b
行都被删除(巧妙地从 a
的行开始)。
我要如何解决这个问题,我想保留:
- 我的数据库架构相同
- 从
a
到b
的级联移除 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
whena
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/