gpt4 book ai didi

java - JPA @OneToMany + @JoinColumn 删除引用表上的更新问题

转载 作者:行者123 更新时间:2023-12-01 09:30:28 30 4
gpt4 key购买 nike

具有以下实体:

@Entity
class Car {
@OneToMany(fetch = FetchType.LAZY, cascade = {})
//@JoinColumn(name = "id_car")
private Collection<Wheel> wheels;

@Entity
class Wheel {
@JoinColumn(name = "id_car", referencedColumnName = "id")
@ManyToOne(fetch = FetchType.LAZY, cascade = {}, optional = false)
private Car idCar;

如果我保留第 4 行的注释,如上所示,系统会自动为我创建一个连接表。但这不是我想要的,因为 Wheel 有自己的链接字段。这就是为什么我取消了第 4 行的注释,并且不再创建连接表,这很好。但现在如果我这样做了

entityManager.remove(myCar); // remove car with id=1

我看到底层系统调用,在实际删除之前,更新sql语句如下:

Fine:   UPDATE wheel SET id_car = ? WHERE (id_car = ?)
bind => [null, 1]

这当然会导致我出现以下情况:

ERROR: null value in column "id_car" violates not-null constraint

如果我保留上述评论,我会看到底层系统执行两次删除:

Fine:   DELETE wheel WHERE id_car = ?
bind => [1]

Fine: DELETE car WHERE id = ?
bind => [1]

这可能没问题,当然它正在工作..即使我更喜欢底层 RDBMS 完成其工作,因为 id_car 是用“删除级联”规则定义的。问题仍然存在,因为创建了一个无用的附加连接表。

问题是:我必须使用什么注释才能获得以下内容:

  • 没有创建额外的连接表
  • em.remove() 子系统上发出一个删除,并让 RDBMS 执行肮脏的级联作业(如果这是不可能的,则可以由应用程序发出多次删除)

最佳答案

您应该在 OneToMany 注释中使用mappedBy 属性来声明该关系由 Wheel 类的 idCar 字段映射:

@OneToMany(fetch = FetchType.LAZY, mappedBy="idCar", cascade = {})
private Collection<Wheel> wheels;

关于java - JPA @OneToMany + @JoinColumn 删除引用表上的更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39473112/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com