JPA @OneToMany + @JoinColumn 移除问题引用者的更新 table
JPA @OneToMany + @JoinColumn remove issues an update on referencer table
具有以下实体:
@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 行的注释,如上所示,系统会自动为我创建一个 join-table。但这不是我想要的,因为 Wheel 有它自己的领域 link。这就是为什么我取消注释第 4 行并且不再创建 join-table 的原因,这很好。但现在如果我这样做
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 是用 "on delete cascade" 规则定义的。问题仍然存在,因为创建了无用的附加连接-table。
问题是:我必须使用什么注释才能获得以下内容:
- 没有额外加入-table 创建
- 在
em.remove()
子系统发出一个删除并让 rdbms 执行肮脏的级联作业(如果这不可能,应用程序发出多个删除是可以的)
您应该在 OneToMany 注释中使用 mappedBy 属性来声明关系由 Wheel 的 idCar 字段映射 class:
@OneToMany(fetch = FetchType.LAZY, mappedBy="idCar", cascade = {})
private Collection<Wheel> wheels;
具有以下实体:
@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 行的注释,如上所示,系统会自动为我创建一个 join-table。但这不是我想要的,因为 Wheel 有它自己的领域 link。这就是为什么我取消注释第 4 行并且不再创建 join-table 的原因,这很好。但现在如果我这样做
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 是用 "on delete cascade" 规则定义的。问题仍然存在,因为创建了无用的附加连接-table。
问题是:我必须使用什么注释才能获得以下内容:
- 没有额外加入-table 创建
- 在
em.remove()
子系统发出一个删除并让 rdbms 执行肮脏的级联作业(如果这不可能,应用程序发出多个删除是可以的)
您应该在 OneToMany 注释中使用 mappedBy 属性来声明关系由 Wheel 的 idCar 字段映射 class:
@OneToMany(fetch = FetchType.LAZY, mappedBy="idCar", cascade = {})
private Collection<Wheel> wheels;