我的多对多关系不涉及标准的“连接表”方法,其中一个表存储“FK1-to-FK2”关系。
相反,我“松散地”加入到旧版只读视图中,如下所示:
Appointment
班级(根据Appointment
表格)
int AppointmentId (PK)
int OrderId
List<LegacyOrder> LegacyOrders
LegacyOrder
类(基于LEGACY_ORDERS_VIEW
我们遗留系统中的视图)
int OrderId (composite PK)
int VersionNumber (composite PK)
一个约会可以有许多(一个版本的)LegacyOrder。
一个 LegacyOrder 可以有多个 Appointments,但这种关系在我们的应用程序中并不重要。
我想LegacyOrders
用指定 OrderId 的所有 LegacyOrders 填充属性。我的映射尝试如下:
<class name="Appointment" table="Appointments" lazy="true">
<bag name="Orders" table="LEGACY_ORDERS_VIEW" inverse="true">
<key column="OrderId" />
<many-to-many class="LegacyOrder" column="ORDER_ID" />
</bag>
</class>
....但由于 SQL 无效,我收到“无法执行查询”异常。
我认为映射中提到的表<bag>
应该是“连接表”....但我没有。
我相当确定我的映射方法从根本上是错误的……正确的方法是什么?
编辑:
谢谢 Radim:LegacyOrder 的更好名称可能是LegacyOrderVersion
:该视图中的每条记录对应于订单的“版本”,而不是订单。
即一个订单可能是 100 个单位,然后当说收集了 20 个单位时,另一条记录被写入相同的 OrderId 但为 80 个单位。(我确实警告过你这是遗产 :)
如果Appointment
(在新系统中)可以检索所有相关LegacyOrderVersions
的 ,那么它可以派生有用的属性,例如CurrentLegacyOrderVersion
和OriginalLegacyOrderVersion
。
FWIW:这对我很有用:
<class name="Appointment" table="Appointments" lazy="true">
<bag name="Orders" inverse="true">
<key property-ref="OrderId" column="ORDER_ID" />
<one-to-many class="LegacyOrder" />
</bag>
</class>