JPA Hibernate ManyToMany,级联和FK

时间:2018-05-06 13:49:57

标签: java mysql hibernate jpa jointable

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

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

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

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

在我看来,这似乎是 OneToMany 关系,因为优惠券并不知道他的所有者是谁,(一家公司管理优惠券,一位客户拥有优惠券),但我发现的有关JPA Hibernate和连接表的所有内容都指向这是一个 ManyToMany 的关系,这让我很困惑。

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

此外,我曾经为所有内容提供归档表,同时从原始表中删除它们。这可能会使处理杂乱无章 所以我添加了 已删除 '每个字段并配置实体的删除功能,通过以下方式将其删除状态更改为:

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

现在,如果您尝试删除公司,只需删除' '价值改变了 但我希望所有未经管理的优惠券 - 与任何现有的未归档公司没有任何关系 - 也可以归档。

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

提前致谢:)

1 个答案:

答案 0 :(得分:0)

  

我发现的有关JPA Hibernate和连接表的所有内容都指向这是一个ManyToMany关系

'如果优惠券不属于任何其他公司(=优惠券可能属于多个公司),则每家公司都可以管理许多优惠券'和' '暗示Coupon - Company多对多关联的事实。 “优惠券不必知道他的所有者是谁”这一事实只会告诉您它应该是单向关联。

  

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

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

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

当公司被删除时,如果优惠券不归任何其他公司所有 - 没有经理 - 优惠券将被删除,因此所有关系(company_coupon和customer_coupon)也是如此。

JPA不会为您处理此事。您的应用程序需要检测并处理此类场景作为其业务逻辑的一部分(这可能听起来像是一个潜在的性能问题,但话又说明,公司实际上会多久被删除一次?)