三个数据表
Order订单表
---------------------------------------------------------
orderid orderdate customer
1
2
3
-------------------------------------------------------
Product商品表
---------------------------------------------------------
productid name cost
1 电视机 500
2 收音机 50
3 手机 90
11 手机 90
12 手机 90
13 手机 90
14 手机 90
-------------------------------------------------------
OrderProduct订单产品表
---------------------------------------------------------
OrderId productid
1 2
-------------------------------------------------------
其中OrderProduct表中有一条记录,记录了订单号为1的订单的产品为产品号为2的产品,即
订单1是一台价值50元的收音机
(一)[Order] 订单表持久(多对多中的第一多)
public class Order
{
public virtual int Unid { get; set; }
public virtual DateTime OrderDate { get; set; }
public virtual string Memo { get; set; }
public virtual Customer Customer { get; set; }
public virtual IList<Product> Products { get; set; }
}
其中Products属性为新加的,为每一个订单都有一个产品集,即一个订单对应多个产品
(二)Product产品表持久(多对多中的第二多)
public class Product
{
public virtual int Unid { get; set; }
public virtual string ProductName { get; set; }
public virtual int Cost { get; set; }
public virtual IList<Order> Orders { get; set; }
}
除了3个常规的持久属性外,还有一个Orders属性,表示每个产品都有一个订单集,即一种(一个)商品对应多个订单
(三)订单映射
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
<class name="Domain.Entities.Order,Domain" table="[Order]" >
<id name="Unid" column="OrderId" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" />
<property name="Memo" column="Memo" type="String"/>
<!--多对一关系:Orders属于一个Customer-->
<many-to-one name="Customer" column="Customer" not-null="true" class="Customer" foreign-key="FK_CustomerOrders"/>
<bag name="Products" generic="true" table="OrderProduct">
<key column="OrderId" foreign-key="FK_orderproduct_order"/>
<many-to-many column="ProductId"
class ="Domain.Entities.Product,Domain"
foreign-key="FK_orderproduct_product"/>
</bag>
</class>
</hibernate-mapping>
在原有文件的基础上添加了多对多关系映射,这里说明一下:
·Order持久类中的IList<Product> Products属性,为Ilist泛型集合,在nhibernate中与bag对应。
·bag的名称为Products,即属性Products
·外键,OrderId,这个是两者关系表(OrderProduct)表中的OrderId,这个不是映射关系,而是数据库字段,大小写不敏感。
·外键名称FK_orderproduct_order
·多对多映射,对应多个产品,类型为Product持久类型,外键FK_orderproduct_product为产品对两者关系表的外键
(四)产品映射
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain.Entities">
<class name="Domain.Entities.Product,Domain" table="Product" >
<id name="Unid" column="productid" type="Int32" unsaved-value="0">
<generator class="native" />
</id>
<property name="ProductName" column="[name]" type="String" not-null="true" />
<property name="Cost" column="Cost" type="Int32"/>
<bag name="Orders" generic="true" table="OrderProduct">
<key column="productid" foreign-key="FK_orderproduct_product"/>
<many-to-many column="OrderId"
class="Domain.Entities.Order,Domain"
foreign-key="FK_orderproduct_order"/>
</bag>
</class>
</hibernate-mapping>
三个常规属性除外,与订单表同理的bag映射
·IList<Order> Orders
·bag的名称为Orders,即属性Orders
·外键,productid,这个是两者关系表(OrderProduct)表中的productid,这个不是映射关系,而是数据库字段,大小写不敏感。
·外键名称FK_orderproduct_product
·多对多映射,对应多个产品,类型为Product持久类型,外键FK_orderproduct_order为订单对两者关系表的外键
说明:多对多关系的实现由中间的一个一对一表来实现,所以这种关系带有很好的对称性。所以可以在对称性上来理解这种微妙的关系。
更多内容请参见:http://www.cnblogs.com/lyj/archive/