Hibernate系列:映射一对多外键双向关联

一对多关联也可分为单向/双向外键关联,我这里只列出其中的一种,其它的可以据此类推(推荐用双向关联)。
SQL:engine_fk表的carid为car_fk表主键的外键
create table ec_item (      
    id number(10,0) not null,      
    product varchar2(15) not null,      
    amount number(10,0) not null,      
    orderid number(10,0) not null,      
    primary key (id)      
);      
create table ec_order (      
    id number(10,0) not null,      
    owner varchar2(15) not null,      
    phone varchar2(15) not null,      
    address varchar2(50),      
    primary key (id)      
);       
alter table ec_item       
    add constraint fk_item_order       
    foreign key (orderid)       
    references ec_order(id);    



POJO:Engine类和Car类都有对方的一个引用(以下为省略写法)

public class Order implements Serializable      
{      
private Set<Item> items = new HashSet<Item>();      
}       
     
public class Item implements Serializable      
{      
private Order order;      
}     



XML:    Order.hbm.xml     Item.hbm.xml(以下为省略写法)
<hibernate-mapping package="com.allanlxf.hibernate.association.o2m.entity">     
  <class name="Order" table="ec_order">     
    <id name="id" column="id" type="integer">     
      <generator class="native" />     
    </id>     
    <set name="items" cascade="all-delete-orphan" inverse="false" >     
      <key column="orderid" />     
      <one-to-many class="Item" />     
    </set>     
  </class>     
</hibernate-mapping>       
     
<hibernate-mapping package="com.allanlxf.hibernate.association.o2m.entity">     
  <class name="Item" table="ec_item">     
    <id name="id" column="id" type="integer">     
      <generator class="native" />     
    </id>     
    <many-to-one name="order" column="orderid" not-null="true" foreign-key="fk_item_order"/>     
  </class>     
</hibernate-mapping>     

a) order.getItems().add(item);
   item.setOrder(order);
   session.save(order);
打印sql如下:
    insert
    into
        ec_order
        (owner, phone, address, id)
    values
        (?, ?, ?, ?)
Hibernate:
    insert
    into
        ec_item
        (product, amount, orderid, id)
    values
        (?, ?, ?, ?)
Hibernate:
    update
        ec_item
    set
        orderid=?
    where
        id=?

one-to-many外键双向关联总结: 需在one的一方设置set集合元素,在many多的一方设置many-to-one元素,在一对多的关联中推荐用这种双向的关联,而不是单向的关联。
以单向关联的插入操作为例:
order.getItems().add(item);
session.save(order);
得到的sql如下:
Hibernate:
    insert
    into
        ec_order
        (owner, phone, address, id)
    values
        (?, ?, ?, ?)
Hibernate:
    insert
    into
        ec_item
        (product, amount, id)
    values
        (?, ?, ?)
程序在运行时会报错:无法将 NULL 插入 ("AUTO_DEMO"."EC_ITEM"."ORDERID")。
仔细观察这里的sql并与前面双向关联时的sql做比较就会发现第二句sql在插入时少插了个orderid,而orderid在数据库中又不为空,因此会报这个错。而在双向关联中就不会出这种错,Hibernate会自动处理好这种情况。


你可能感兴趣的:(sql,Hibernate,xml)