我有两个班级
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>
答案 0 :(得分:1)
是。将账户中的OneToMany映射到发票。当你认为它需要一个连接表时你错了 - 它没有。根据您希望拥有Invoice-&gt; 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允许缓存赢得&#39;如果你没有反映数据库。
你可以看到很多关于这种关系的教程,但我发现最简单的解释是: 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;
}
答案 1 :(得分:0)
我可以建议的一件事是在数据库中的外键关系中设置级联删除。这样,当帐户被删除时,所有相关的发票都将被轻易删除。