Я приведу вам аналогичный сценарий только для большей ясности:
Сценарий 1:
Table Products
Product_Id(PK)
Product_Name
Price
Table Orders
Order_Id(PK)
Order_Date
Total
Table Order_Products
Order_Product_Id(PK) (Surrogate key)
Order_Id(FK)
Product_Id(FK)
Quantity
В этой области у нас есть многие ко многимСоотношение между таблицами Orders
и Products
выглядит следующим образом:
- Заказ имеет много продуктов.
- Продукт может принадлежать многим заказам.
Когда мы сопоставляем отношение «многие ко многим», отображение файла Order_Products
не будет содержать никакой реализации для этого отношения, оно будет выражаться двумя отображениями «многие ко многим» (два пакета или два набора из двух классов) вдве стороны отношения следующим образом:
Для Products.hbm:
<class name="Products" table="Products">
<id name="Product_Id" column="Product_Id">
<generator class="native"/>
</id>
<bag name="Orders" generic="true" table="Orders_Products">
<key column="Product_Id"/>
<many-to-many column="Add_Orders_Id" class="Orders"/>
</bag>
...and other properties
</class>
Orders.hbm:
<class name="Orders" table="Orders">
<id name="Order_Id" column="Order_Id">
<generator class="native"/>
</id>
<bag name="Products" generic="true" table="Order_Products">
<key column="Orders_Id"/>
<many-to-many column="Product_Id" class="Products"/>
</bag>
...
Это означает, что Product_Id
изТаблица Products
имеет отношение многие ко многим с Order_Id
в таблице Orders
.
Обратите внимание, что таблица в сумке tag
является таблицей сопоставления "многие ко многим", котораяпромежуточная точка отношения, и Order_Id
внутри пакета - это FK в Order_Products
, который относится к Products
таблица.
Имена двух сумок - это имена двух коллекций в двух классах, представляющих отношения «многие ко многим» в классе «Продукты»:
public virtual IList<Orders> Orders
{
get;
set;
}
ВOrders
класс у вас есть список продуктов:
public virtual IList<Products> Products
{
get;
set;
}
В Order_Products.hbm вам просто не нужно ничего делать для этого отношения, однако вам не нужно отображать таблицуOrder_Products
, если он содержит только внешние ключи и не имеет дополнительных свойств, например, если у него нет свойства «Количество»:
<class name="Order_Products" table="Order_Products">
<id name="Order_Product_Id" column="Order_Product_Id">
<generator class="native" />
</id>
<property name="Quantity" type="Decimal" column="Quantity" />
</class>
В других двух сценариях, я думаю, вы будете следовать тому же отображениюза исключением того, что вы будете использовать составной ключ (<composite-id>
) для сопоставления дополнительного составного первичного ключа, но сопоставления будут одинаковыми.
Для двух других сценариев, честно говоря, я не пробовал сопоставлениесам составной идентификатор, но я думаю, что отношение будет таким же, и составной ключ не повлияет на отношение, однако команда Hibernate настоятельно не рекомендует использовать составной kэй.
Я просто проигнорировал много кода в отображениях xml просто для простоты.