2

我有一张 Voucher - POJO 映射到两个表。第一个映射分配实体名称“voucherA”并将 POJO 映射到 TableA。第二个映射使用“voucherB”作为实体名称并将 POJO 映射到 TableB。

现在我还有一个客户 POJO 映射到 TableC。此 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>

我如何正确映射从客户到凭证的多对多关联列表,以便如果客户 POJO 被持久化,则如果 Voucher 实体不存在,则将其持久化到 TableB,而不是 TableA?这可以做到吗?如果不是,那么将客户使用的凭证保存到 tableB 的解决方法是什么?(TableA 仅包含可用的 Vouchers,不包含已使用的 Vouchers)

4

2 回答 2

3

您的核心模型似乎是错误的。您的Voucher实体可能具有许多属性 - 在被 a 使用后它们是否都发生了变化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将变为“一对多”(此客户使用的优惠券集合);否则很容易通过查询检索。

You can't physically delete from Vouchers table under this scenario, though (unless Voucher in question was never used). You'll have to do a logical delete instead.

于 2009-11-02T16:43:05.477 回答
1

我的建议是将所有凭证存储在同一张表中。要区分已使用和未使用的,您可以使用布尔标志或鉴别器值(如果您在 Java 代码中使用继承)。

即使您拥有现有数据,迁移似乎也不会非常困难。一旦所有凭证都在同一张表中,它们与客户的关系就变成了直接的多对多。

我认为维护两个表会很困难。本质上,您仍在存储是否使用凭证,但您并没有明确地这样做。我确信可能有一种解决方法,但我认为我上面概述的要简单得多。根据我的经验,这是我每次遇到类似问题时都会选择的路线。

于 2009-11-02T16:34:37.803 回答