一对一主键单向联系关系
一对一主键单向关联
SQL:car_pk_single表的主键为engine_pk_single表主键的外键
create table car_pk_single (
id number(10,0) not null,
name varchar2(15),
serial varchar2(30),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
create table engine_pk_single (
id number(10,0) not null,
model varchar2(20),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
alter table car_pk_single
add constraint fk_car_engine_pk_single
foreign key (id)
references engine_pk_single(id);
POJO:Engine类和Car类都有对方的一个引用(以下为省略写法)
public class Car implements Serializable
{
private Engine engine;
}
public class Engine implements Serializable
{
//这里没有属性Car
... ...
}
XML: Car.hbm.xml Engine.hbm.xml(以下为省略写法)
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">
<class name="Car" table="car_pk_single" >
<id name="id" column="id" type="integer">
<generator class="foreign">
<param name="property">engine</param>
</generator>
</id>
<one-to-one name="engine" class="Engine" constrained="true" />
</class>
</hibernate-mapping>
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">
<class name="Engine" table="engine_pk_single" >
<id name="id" column="id" type="integer">
<generator class="native"></generator>
</id>
</class>
</hibernate-mapping>
a) car.setEngine(engine);
session.save(car);
程序将先保存engine到数据库,然后再保存car
b) session.get(Car.class, id),打印sql如下:
select
car0_.id as id0_0_,
car0_.name as name0_0_,
car0_.serial as serial0_0_,
car0_.manufacturer as manufact4_0_0_,
car0_.producedate as produced5_0_0_
from
car_pk_single car0_
where
car0_.id=?
c) 在car.hbm.xml的one-to-one元素中添加outer-join="true", 能得到一个内连接sql。
d) session.delete(car),将只删除car,而不删除engine。
e) 在car.hbm.xml的one-to-one元素中添加cascade="all" ,再执行session.delete(car),则能级联删除engine
one-to-one主键单向关联映射总结: 需对有外键一方的xml文件设置constrained="true"。
若操作涉及到映射关系双方的数据,以操作有外键一方的对象为主(在有级联的情况下);
若操作只涉及到有外键的一方,则只操作这一方对象即可。
SQL:car_pk_single表的主键为engine_pk_single表主键的外键
create table car_pk_single (
id number(10,0) not null,
name varchar2(15),
serial varchar2(30),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
create table engine_pk_single (
id number(10,0) not null,
model varchar2(20),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
alter table car_pk_single
add constraint fk_car_engine_pk_single
foreign key (id)
references engine_pk_single(id);
POJO:Engine类和Car类都有对方的一个引用(以下为省略写法)
public class Car implements Serializable
{
private Engine engine;
}
public class Engine implements Serializable
{
//这里没有属性Car
... ...
}
XML: Car.hbm.xml Engine.hbm.xml(以下为省略写法)
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">
<class name="Car" table="car_pk_single" >
<id name="id" column="id" type="integer">
<generator class="foreign">
<param name="property">engine</param>
</generator>
</id>
<one-to-one name="engine" class="Engine" constrained="true" />
</class>
</hibernate-mapping>
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">
<class name="Engine" table="engine_pk_single" >
<id name="id" column="id" type="integer">
<generator class="native"></generator>
</id>
</class>
</hibernate-mapping>
a) car.setEngine(engine);
session.save(car);
程序将先保存engine到数据库,然后再保存car
b) session.get(Car.class, id),打印sql如下:
select
car0_.id as id0_0_,
car0_.name as name0_0_,
car0_.serial as serial0_0_,
car0_.manufacturer as manufact4_0_0_,
car0_.producedate as produced5_0_0_
from
car_pk_single car0_
where
car0_.id=?
c) 在car.hbm.xml的one-to-one元素中添加outer-join="true", 能得到一个内连接sql。
d) session.delete(car),将只删除car,而不删除engine。
e) 在car.hbm.xml的one-to-one元素中添加cascade="all" ,再执行session.delete(car),则能级联删除engine
one-to-one主键单向关联映射总结: 需对有外键一方的xml文件设置constrained="true"。
若操作涉及到映射关系双方的数据,以操作有外键一方的对象为主(在有级联的情况下);
若操作只涉及到有外键的一方,则只操作这一方对象即可。