繁体   English   中英

JPA @OneToMany + @JoinColumn删除会发布引用表的更新

[英]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行保持注释,如上所示,系统会自动为我创建一个联接表。 但这不是我想要的,因为Wheel对于此链接具有其自己的字段。 这就是为什么我没有注释第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是使用“按删除级联”规则定义的,这可能很好,并且当然也可以使用。 问题仍然存在,因为创建了无用的附加联接表。

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

  • 没有创建其他联接表
  • em.remove()子系统上,发出一个删除操作,并让rdbms进行肮脏的级联工作(如果不可能,则可以由应用程序发出多个删除操作)

您应该在OneToMany批注中使用mappingBy属性,以声明该关系已由Wheel类的idCar字段映射:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM