gpt4 book ai didi

mysql - 多对一hibernate在删除一个时删除多个?

转载 作者:行者123 更新时间:2023-11-29 00:10:32 24 4
gpt4 key购买 nike

我有两个类(class)

Account
id.
....

Invoice
id...
....
account_id (many to one)

由于一个用户存在许多发票,并且它需要一个用户,所以我在发票中写成多对一。我认为级联意味着如果我删除发票,那么它将通过尝试添加更新/删除等来影响帐户。

但是要删除一个帐户有外键,这意味着它不能被删除,除非我先删除所有发票。

解决方法是在帐户中使用一对多/连接表,但我宁愿使用多对一,因为发票需要一个帐户。

我可以在 orm 中设置一个设置来表示:如果我删除发票,帐户不会发生任何变化。如果我删除一个帐户,所有链接到它的发票都会被删除

目前::

  <many-to-one name="account" fetch="EAGER" 
target-entity="UserAccount">
<join-column name="account_id"/>
<cascade><cascade-all/></cascade>
</many-to-one>

最佳答案

是的。将帐户中的 OneToMany 映射到发票。当您认为它需要一个连接表时,您就错了——它不需要。基于你想要一个 Invoice->Account ManyToOne 关系,你可以重用这个关系:

@Entity
Class Account {
@OneToMany(cascade=ALL, mappedBy="account")
List<Invoice> invoices;
}

@Entity
Class Invoice{
@ManyToOne
Account account;
}

这些设置意味着如果您删除一个帐户,JPA 也将删除所有引用的发票。由于 Invoice.account 关系上没有级联设置,因此删除发票不会影响该帐户。也就是说,您应该在删除发票实例时从 Account.invoice 集合中删除发票。 JPA 不会为您维护双向关系,因此当您修改双向关系的一侧时,您需要同时修改另一侧以使您的对象模型与数据库保持同步 - JPA 允许缓存,但不会反射(reflect)数据库,如果你不这样做。

关于这种关系,您可以查看许多教程,但我找到的最简单的解释是: http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Mapping/Relationship_Mappings/Collection_Mappings/OneToMany

如果您不希望它是双向的(即您不希望 Invoice.account 引用),我相信 JPA 2.0 允许您在 OneToMany 上使用 @JoinColumn 注释:

@Entity
Class Account {
@OneToMany(cascade=ALL)
@JoinColumn(name="account_id")
List<Invoice> invoices;
}

关于mysql - 多对一hibernate在删除一个时删除多个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25323478/

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