当前位置: 首页 > 知识库问答 >
问题:

JPA Hibernate ManyToMany、cascading和FK

严阳成
2023-03-14

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

有公司表、客户表和优惠券表。每个公司可以管理许多优惠券,每个客户也可以‘购买’许多优惠券。

因此,我有一个名为company_coupon的联接表和另一个名为customer_coupon的表。
当删除一个公司时,如果该优惠券不属于任何其他公司(因此没有经理),那么该优惠券就会被删除,因此所有的关系(company_coupon和customer_coupon)也会被删除。

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

在我看来,这像是一个单一的关系,因为优惠券不需要知道他的所有者是谁(公司管理优惠券,客户拥有优惠券),但是我发现的关于JPA Hibernate和join表的所有信息都表明这是一个单一的关系,这让我感到困惑。

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

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

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

现在,如果您试图删除一个公司,只会更改'removed'值。
但我希望所有未管理的优惠券--与任何现有的、未存档的公司没有关系--也被存档。

真正复杂的过程只是为了管理数据…有什么办法能有效地做到这一点吗?

提前致谢:)

共有1个答案

鞠鸿雪
2023-03-14

我发现的关于JPA Hibernate和join表的所有信息都表明这是一个多层面的关系

“每个公司可以管理许多优惠券”和“如果优惠券不属于任何其他公司(一个优惠券可能属于多个公司)”暗示了coupon-company是一个多对多的关联。“优惠券不需要知道他的主人是谁”这一事实只告诉你,它可能应该是一个单向关联。

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

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

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

当一个公司被删除时,如果优惠券不属于任何其他公司(因此没有经理),那么优惠券就会被删除,因此所有的关系(company_coupon和customer_coupon)也会被删除。

JPA不会帮你解决这个问题。您的应用程序将需要检测和处理这样的场景作为其业务逻辑的一部分(这听起来可能像是一个潜在的性能问题,但话说回来,一个公司实际上要被删除的频率是多少?)

 类似资料:
  • Cascading是一个新式的针对Hadoop clusters的数据处理API,它使用富于表现力的API来构建复杂的处理工作流,而不是直接实现Hadoop MapReduce的算法。

  • 中间件函数是可以在应用程序的请求 - 响应周期中访问context object和下一个中间件函数的函数。 这些函数用于修改任务的请求和响应对象,例如解析请求主体,添加响应头等。Koa更进一步,产生'downstream' ,然后将控制回流'upstream' 。 此效果称为cascading 。 以下是一个中间件功能的简单示例。 var koa = require('koa'); var app

  • 需要显式调用 save() 仍然很麻烦,我们可以用级联来解决这个问题。 <set name="children" inverse="true" cascade="all"> <key column="parent_id"/> <one-to-many class="Child"/> </set > 这样上面的代码可以简化为: Parent p = (Parent) sessio

  • 问题内容: 关于它们有很多传说。我想知道真相。以下两个示例之间有什么区别? 问题答案: 不确定从何处获得传说,但: 提交按钮 与: IE6将在标记之间提交此按钮的所有文本,其他浏览器将仅提交值。使用可使您在按钮的设计上享有更大的布局自由度。从各种意图和目的看,它乍一看似乎很棒,但是各种浏览器怪癖使它有时很难使用。 在您的示例中,IE6将发送到服务器,而其他大多数浏览器将不发送任何内容。要使其跨浏览

  • 什么区别以及如何正确重写代码?

  • 我试图理解为什么下面两个代码块会产生不同的结果。 代码块1按预期工作,并返回从数据库中查找的提供程序的数组。另一方面,代码块2返回函数数组。在理解promissione.all()和async/await时,我觉得缺少了一些简单的东西。 代码块的差异如下: > 块1:创建许诺函数数组,然后使用map运算符将其包装在异步函数中。 块2:许诺函数的数组被创建为异步函数。因此,不调用map运算符。 如果