Hibernate映射一对一外键双向关联

一对一外键关联是一对多外键关联的特例,只是在多的一方加了个唯一性约束。
SQL:engine_fk表的carid为car_fk表主键的外键
create table car_fk (      
    id number(10,0) not null,      
    name varchar2(15) not null,      
    serial varchar2(30) not null,      
    manufacturer varchar2(50) not null,      
    producedate date,      
    primary key (id)      
);      
create table engine_fk (      
    id number(10,0) not null,      
    model varchar2(20) not null,      
    manufacturer varchar2(50) not null,      
    producedate date,      
    carid number(10,0) unique,      
    primary key (id)      
);      
alter table engine_fk       
    add constraint fk_engine_car_fk       
    foreign key (carid)       
    references car_fk(id);     



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

public class Car implements Serializable      
{      
private Engine engine;      
}       
public class Engine implements Serializable      
{      
private Car car;      
}    



XML:    Car.hbm.xml     Engine.hbm.xml(以下为省略写法)

<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">      
  <class name="Car" table="car_fk">      
    <id name="id" column="id" type="integer">      
      <generator class="native" />      
    </id>      
    <one-to-one name="engine" class="Engine"  cascade="all"/>      
  </class>      
</hibernate-mapping>       
     
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">      
  <class name="Engine" table="engine_fk">      
    <id name="id" column="id" type="integer">      
      <generator class="native"/>      
    </id>      
    <many-to-one name="car" class="Car" column="carid" unique="true" />      
  </class>      
</hibernate-mapping>     

a) engine.setCar(car);
   car.setEngine(engine);
   session.save(car);
程序将先保存car到数据库,然后再保存engine

b) session.get(Car.class, id),将得到一个左外连接的sql;  

one-to-one外键双向关联映射总结: 需对有外键一方的xml文件设置column="carid" unique="true"。
若操作涉及到映射关系双方的数据,以操作没有外键一方的对象为主(在有级联的情况下),不过由于查询时为左连接查询,结果会有出入,此时用hql比较准确;
若操作只涉及到有外键的一方,则只操作这一方对象即可。

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