java—如何将多对多关联Map到Map到两个不同表的类?

rggaifut  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(340)

我有一个Map到两个表的凭证pojo。第一个Map分配一个实体名“vouchera”,并将pojoMap到tablea。第二个Map使用“voucherb”作为实体名,并将pojoMap到tableb。
现在我还有一个Map到tablec的客户pojo。此pojo引用列表中的凭证。

<list name="vouchers" table="TableC_vouchers">
  <key column="pid"/>
  <list-index column="position" base="0"/>

  <!-- how to do that right -->
  <many-to-many column="voucher_id" entity-name="voucherB"/>
</list>

如何正确Map从客户到凭证的多对多关联列表,以便如果客户pojo被持久化,那么凭证实体如果不存在,则持久化到tableb,而不是tablea?这能做到吗?如果不是,那么解决方案会是什么样子,以便将客户使用的凭证持久化到tableb(表A仅包含可用的凭证,不包含已使用的凭证)

nnt7mjpx

nnt7mjpx1#

你的核心模型似乎错了。你的 Voucher 实体大概有很多属性-它们在被一个 Customer ? 我对此表示怀疑。然而,您在a和b表中复制它们,这意味着您的模式没有规范化。
“可用”凭证和“已用”凭证不是(或不应是)同一实体。相反,我建议您为 UsedVoucher 两者都有联系 Voucher 一对多 Customer 多对一,只包含 Voucher (如有)。所以,

Voucher(id, other attributes) // doesn't change from what you have now
Customer (id, other attributes) // doesn't change except for many-to-many; see below
UsedVoucher(id,
 voucher, // what Voucher was used by that customer
 customer, // what Customer has used that voucher
 changed voucher attributes, // if any
 additional attributes // if needed, such as date/time when voucher was used
)

你的“多对多”节目 Customer 如果您需要它作为可维护的财产,它将成为“一对多”(此客户使用的凭证集合);否则很容易通过查询检索。
你不能从中删除 Vouchers 但在这种情况下(除非从未使用过有问题的凭单)。你必须做一个逻辑删除。

ego6inou

ego6inou2#

我的建议是把所有的代金券都放在同一张表里。要区分已使用和未使用的,可以使用布尔标志或鉴别器值(如果在java代码中使用继承)。
即使您有现有的数据,迁移似乎也不会非常困难。一旦所有代金券都在同一张表中,它们与客户的关系就变成了直接的多对多关系。
我认为维持两张table是很困难的。本质上,您仍在存储凭证是否已使用,但没有显式地进行存储。我肯定有解决办法,但我认为我上面概述的要简单得多。以我的经验,这是我每次遇到类似问题时都会选择的路线。

相关问题