【问题标题】:JPA Hibernate ManyToMany, cascading and FKJPA Hibernate 多对多、级联和 FK
【发布时间】:2018-10-16 10:43:00
【问题描述】:

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

公司客户优惠券有表格。 每个公司可以管理很多优惠券,每个客户也可以“购买”很多优惠券

因此,我有一个名为 company_coupon 的连接表和另一个名为 customer_coupon 的表。
当一个 Company 被删除时,如果 Coupon 不属于任何其他 Company - 因此没有经理 - Coupon 将被删除,并且因此,所有关系(company_couponcustomer_coupon)也是如此。

当客户被删除时,coupon_customer 中的关系也应该被删除。

在我看来,这就像 OneToMany 关系,因为 优惠券 不必知道他的所有者是谁,(公司管理优惠券,客户拥有优惠券) ,但我发现的有关 JPA Hibernate 和连接表的所有内容都表明这是一个 ManyToMany 关系,这让我感到困惑。

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


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

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

现在,如果您尝试删除公司,只会更改“removed”值。
但我希望所有未被管理的优惠券(与任何现有的、未归档的公司无关)也被归档。

仅用于管理数据的过程真的很复杂.. 任何想法如何有效地做到这一点?

提前致谢:)

【问题讨论】:

  • 我认为这个delete语句会和update语句类似。所以当你定义 SqlDelete 它将不起作用

标签: java mysql hibernate jpa jointable


【解决方案1】:

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

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

当一个客户被删除时,coupon_customer 中的关系也应该被删除。

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

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

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

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

【讨论】:

  • 1) 一旦我执行了Company.coupons.remove(c),就会自动从数据库中删除Coupon c,或者只是关系。 2) 这么软DELETE在管理连接表的同时,也应该作为业务逻辑的一部分来处理?
  • (1) 只会删除关系,(2) 我从未使用过@SQLDelete,但是如果您发现它与您的用例配合得很好,我想没有理由不使用它
猜你喜欢
  • 2011-06-23
  • 2017-02-24
  • 2022-10-07
  • 2021-04-10
  • 2013-01-13
  • 2011-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多