技术开发 频道

关于Hibernate的关联关系及其操作


【IT168 技术文档】
    3、 多对多关联
    Hibernate关联关系中相对比较特殊的就是多对多关联,多对多关联与一对一关联和一对多关联不同,多对多关联需要另外一张映射表用于保存多对多映射信息。由于多对多关联的性能不佳(由于引入了中间表,一次读取操作需要反复数次查询),因此在设计中应该避免大量使用。同时,在对多对关系中,应根据情况,采取延迟加载机制来避免无谓的性能开销。多对多关联只有双向关联,假如有订单对象(Order)和产品对象(Product),一个订单可以对应多个产品,一个产品同样也可以对应多个订单,订单和产品的关系就属于多对多关联关系。为表示它们之间的关系,还需建立一张订单—产品关系表(Order_Product),这张表里只存储order表和product表的关联关系,并没有额外的内容。这三者关系如图3-1:


图3-1

    下面是Order和Product所对应的映射文件:
    ● Order.hbm.xml:

<hibernate-mapping> <class name="hibernate.Order" table="order" schema="dbo" catalog="test"> <id name="id" type="java.lang.Long"> <column name="id" /> <generator class="uuid.hex" /> </id> <property name="orderName" type="java.lang.String"> <column name="order_name" length="50" not-null="true" /> </property> <set name="product" table="order_product" cascade="all"> <key column="order_id"/> <many-to-many class="hibernate.Order" Column="product_id"/> </set> </class> </hibernate-mapping>

    ● Product.hbm.xml:

<hibernate-mapping> <class name="hibernate.Product" table="product" schema="dbo" catalog="test"> <id name="id" type="java.lang.Long"> <column name="id" /> <generator class="uuid.hex" /> </id> <property name="productName" type="java.lang.String"> <column name="product_name" length="50" not-null="true" /> </property> <set name="order" table="order_product" inverse="true" cascade="save_update"> <key> <column name="product_id" not-null="true" /> </key> <many-to-many class="hibernate.Order" column="order_id"/> </set> </class> </hibernate-mapping>

    一般情况下,cascade应该设置为“save-update”,对于多对多逻辑而言,很少出现删除一方需要级联删除所有关联数据的情况,如删除一个Order,一般不会删除其中包含的Product(这些Product 可能还被其他的Order所引用)。反之删除Product一般也不会删除其所关联的所有Order。

0
相关文章