【发布时间】:2019-06-13 13:02:53
【问题描述】:
我有两张桌子,b 和 a:
- 它们具有一对一的双向关系
-
a有一个到b的外键来定义这种关系 - 此外键也被视为
a的主键和JPA@ID - 我想要一个级联删除,在删除
a时删除相关的b - 在 MySQL 中,
a的b_id是NOT NULL
问题是,当我使用 JPA 存储库删除我的 A 对象时,我在其外键上得到一个 ConstraintViolationException。
我希望a 和b 行都被删除(巧妙地从a 的行开始)。
如果知道我想保留,我怎么能解决这个问题:
- 我的数据库架构相同
- 从
a到b的级联删除 -
bid 是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;
}
[编辑] 在回答 cmets 进行所有讨论并重新阅读我的问题之后,orphanRemoval 的提案确实在范围内并且有效。
【问题讨论】:
-
为了帮助诊断问题,请为这两个表分别提供
SHOW CREATE TABLE。 -
你是对的@RickJames,它更清楚了,完成了。
-
谢谢。现在,请证明需要在一对表之间进行 1:1 映射。在开发的早期,几乎总是“糟糕的模式设计”。在开发的后期完成时,它通常是权宜之计或性能的一个组合。
-
@RickJames 我不想解释这个设计的完整背景(不是在开发的早期),无论如何这是问题的假设之一。鉴于此,我能否实现我所针对的 JPA 设计?
-
我更喜欢在自己的代码中进行级联删除(等)。这样我就不必怀疑 FK 是否会“做正确的事”或“不能做这个复杂的级联”。
标签: java mysql spring hibernate spring-boot