jpa-hibernate-manytomy、级联和fk

aiqt4smr  于 2021-06-25  发布在  Mysql
关注(0)|答案(1)|浏览(349)

我正在将我的项目的数据库管理从jdbc-mysql转换为jpa-hibernate,数据库应该保持不变(从简单的jersey api到spring和hibernate api)。
有公司、顾客和优惠券的table。每个公司可以管理许多优惠券,每个客户也可以“购买”许多优惠券。
因此,我有一个名为company\u coupon的联接表和另一个名为customer\u coupon的表。
当公司被删除时,如果优惠券不属于任何其他公司-因此没有经理-优惠券被删除,因此所有关系(公司优惠券和客户优惠券)也被删除。
删除客户时,还应删除优惠券客户中的关系。
在我看来,这似乎是一种一对一的关系,因为优惠券不必知道他的所有者是谁(一家公司管理优惠券,一个客户拥有优惠券),但我发现的关于jpa hibernate和join tables的一切都表明这是一种多对多的关系,这让我很困惑。
如何定义我在jpa hibernate中描述的内容?
而且,我以前在从原始表中删除所有内容时都有存档表。这会让处理东西变得混乱。
因此,我为每个实体添加了一个“removed”字段,并配置了实体的delete函数,通过以下方式将其removed状态更改为true:

@SQLDelete(sql = 
        "UPDATE " + TableHelper.TBL_COMPANY 
        + " SET " + TableHelper.REMOVED + " = true"
        + " WHERE " + TableHelper.COMPANY_KEY + " = ?")

现在,如果您试图删除一个公司,只会更改'removed'值。
但我希望所有未经管理的优惠券(与任何现有的、未归档的公司都没有关系)也能归档。
管理数据的过程非常复杂。。有没有办法有效地做这件事?
提前感谢:)

kognpnkq

kognpnkq1#

关于jpahbernate和join表,我所发现的一切都表明这是一种多方面的关系
“每个公司都可以管理许多优惠券”和“如果优惠券不属于任何其他公司(=一张优惠券可能属于多个公司)”,暗示了以下事实: Coupon - Company 是一个多对多的关联。“优惠券不必知道它的主人是谁”这一事实只告诉你,它应该是一个单向的关联。
删除客户时,还应删除优惠券客户中的关系。
这将自动发生,前提是 Customer 是关系的拥有方(既然你想让它成为一个单向关联,你就没有其他选择了)。简单声明 Customer.coupons 作为多对多的关联,如下所示:

@ManyToMany
@JoinTable(name = "customer_coupon", joinColumns = ..., inverseJoinColumns = ...)
private Set<Coupon> coupons;

当公司被删除时,如果优惠券不属于任何其他公司-因此没有经理-优惠券被删除,因此所有关系(公司优惠券和客户优惠券)也被删除。
jpa不会帮你处理的。你的应用程序将需要检测和处理这样一个场景作为其业务逻辑的一部分(这听起来可能是一个潜在的性能问题,但话说回来,一个公司实际上多久会被删除一次?)

相关问题