我有两个类(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/