JPA 休眠 ManyToMany,级联和 FK



我正在将项目的数据库管理从JDBC MySQL转换为JPA Hibernate,数据库应该保持不变。 (从简单的 Jersey API 到 Spring with Hibernate api)。

公司客户优惠券的表格。 每个公司可以管理许多优惠券,每个客户也可以"购买">许多优惠券

因此,我有一个名为company_coupon的连接表和另一个名为customer_coupon的表。
一家公司被删除时,如果优惠券不属于任何其他公司- 因此没有经理 - 优惠券将被删除,因此所有关系(company_couponcustomer_coupon)也将被删除。

删除客户时,还应删除coupon_customer中的关系。

在我看来,这似乎是一对一的关系,因为优惠券不必知道他的主人是谁,(一家公司管理优惠券,一个客户拥有优惠券),但我发现的关于 JPA 休眠和连接表的所有内容都表明这是一个ManyToMany关系,这让我感到困惑。

如何定义我在 JPA Hibernate 中描述的内容?


此外,我曾经为所有内容提供存档表,同时将它们从原始表中删除。 这可能会使处理东西变得混乱。
因此,我为每个字段添加了一个">已删除"字段,并配置了实体的删除函数,以通过以下方式将其删除状态更改为 true:

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

现在,如果您尝试删除公司,则只会更改">已删除"值。
但我希望所有未管理的优惠券 - 与任何现有的,未存档的公司没有关系 - 也都存档。

非常复杂的过程只是为了管理数据......有没有想法如何有效地做到这一点?

提前致谢:)

我发现的有关 JPA 休眠和连接表的所有内容都表明这是一个多对多关系

">

每家公司可以管理许多优惠券"和"如果优惠券不属于任何其他公司(=优惠券可能属于多个公司)"暗示Coupon - Company是一个多对多协会的事实。"优惠券不必知道他的主人是谁"这一事实只能告诉你它可能应该是一个单向关联。

删除

客户时,还应删除coupon_customer中的关系。

这将自动发生,前提是Customer是关系的拥有方(并且由于您无论如何都想使其成为单向关联,因此您实际上没有任何其他选择)。只需将Customer.coupons声明为多对多关联,如下所示:

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

当一家公司被删除时,如果优惠券不属于任何其他公司 - 因此没有经理 - 优惠券将被删除,因此所有关系(company_coupon和customer_coupon)都会被删除。

JPA不会为您处理。你的应用需要检测和处理这种情况,作为其业务逻辑的一部分(这听起来像是一个潜在的性能问题,但话又说回来,公司实际上多久被删除一次?