我有一个凭证 - POJO映射到两个表。第一映射分配一个实体名称“voucherA”和POJO映射到表A。所述第二映射使用“voucherB”作为实体名称和POJO映射到表B

现在我也有映射到表C客户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>

怎么会这样,如果客户POJO持久保存,该券的实体被保存到表B,如果不存在,他们在那里,而不是表A做我正确映射许多-to-many关联的从客户凭证清单?可以这样做?如果没有,就一个解决方法是什么样子,使客户使用优惠券被保存到tableB的? (表A只包含可用的优惠券,而不是所使用的那些)

有帮助吗?

解决方案

您的核心模型似乎是错误的。你Voucher实体想必有许多属性 - 做它的使用由Customer毕竟他们有变化吗?我不信。然而,你在你的A和B表中复制它们,这意味着你的模式是不归。

“可用”凭单和“使用的”凭单不是(或不应该是)相同的实体。我反而建议你创建UsedVoucher一个新的实体,将链接到两个Voucher许多-to-one和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表中删除此情景下,虽然(除非券对问题是从来没有使用过)。你必须做一个逻辑删除吧。

其他提示

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

即使你现有的数据似乎并不像迁移将是非常困难的。一旦所有的券在同一个表,他们的客户关系变得直了许多一对多。

我想保持两个表将是困难的。从本质上讲,你还是一个存储凭证是否使用与否,而是你不这样做明确。我敢肯定,有可能是一个解决办法,但我想我先前提到要简单得多。根据我的经验,这是我选择的路线每当遇到类似的问题时。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top