Hibernate一对一的两种形式
来源:互联网 发布:java初学者入门指南 编辑:程序博客网 时间:2024/05/17 03:55
一种是共享主键,一种是独立外键.
比如User和Account是一对一的关系,若将外键加到User表,Account表为主表,User表为辅表
1).共享主键方法名方式:主外键是一样的,在主表方写<one-to-one name="关联属性"/>
辅表方写:<one-to-one name="关联属性",constrained="false">,还要注意辅表的主健生成方式必需该为foreign
即: <id name="oid" column="OID" >
<generator class="foreign">
<param name="property">addr</param>
</generator>
</id>
2).独立外键:主外键不一样,
在主表方写
<one-to-one name="owner"
property-ref="acct" />
在辅表方写 <many-to-one name="关联属性" column="字段名" unique="true"/>
********************************************************************************
做映射之前,有几点先解释清楚:
a,在hibernate3中,所有的实体设置文件中的lazy属性都被默认设成了true,就是当这个类没有被调用时,延时加载。
1,映射关联
1.1 one-to-one主键关联映射(双向关联,这是常用的方式)
SQL:car_pk表的主键为engine_pk表主键的外键
create table car_pk (
id number(10,0) not null,
name varchar2(15),
serial varchar2(30),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
create table engine_pk (
id number(10,0) not null,
model varchar2(20),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
alter table engine_pk
add constraint fk_engine_car_pk
foreign key (id)
references
id number(10,0) not null,
name varchar2(15),
serial varchar2(30),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
create table engine_pk (
id number(10,0) not null,
model varchar2(20),
manufacturer varchar2(50),
producedate date,
primary key (id)
);
alter table engine_pk
add constraint fk_engine_car_pk
foreign key (id)
references
POJO:Engine类和Car类都有对方的一个引用(以下为省略写法)
public class Car implements Serializable
{
private Engine engine;
}
public class Engine implements Serializable
{
private Car car;
}
{
private Engine engine;
}
public class Engine implements Serializable
{
private Car car;
}
XML: Car.hbm.xml (以下为省略写法)
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">
<class name="Car" table="car_pk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<one-to-one name="engine" class="Engine" cascade="all"/>
</class>
</hibernate-mapping>
<class name="Car" table="car_pk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<one-to-one name="engine" class="Engine" cascade="all"/>
</class>
</hibernate-mapping>
Engine.hbm.xml
<hibernate-mapping package="com.allanlxf.hibernate.association.o2o.entity">
<class name="Engine" table="engine_pk">
<id name="id" column="id" type="integer"><!-- -->
<!-- 主键关联 这里car的值引自one-to-one元素中的name属性的值-->
<generator class="foreign">
<param name="property">car</param>
</generator>
</id>
<!-- 若constrained=true,则表明存在外键与关联表对应,且关联表中肯定存在对应的键与其对应。
另外该选项最关键的是影响save和delete的先后顺序。
例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。-->
<one-to-one name="car" class="Car" constrained="true"/>
</class>
</hibernate-mapping>
<class name="Engine" table="engine_pk">
<id name="id" column="id" type="integer"><!-- -->
<!-- 主键关联 这里car的值引自one-to-one元素中的name属性的值-->
<generator class="foreign">
<param name="property">car</param>
</generator>
</id>
<!-- 若constrained=true,则表明存在外键与关联表对应,且关联表中肯定存在对应的键与其对应。
另外该选项最关键的是影响save和delete的先后顺序。
例如增加的时候,如果constainted=true,则会先增加关联表,然后增加本表。删除的时候反之。-->
<one-to-one name="car" class="Car" constrained="true"/>
</class>
</hibernate-mapping>
one-to-one唯一外键关联映射(双向关联)
SQL:car_pk表的主键为engine_pk表中某一非主键的外键
XML: Car.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" property-ref="car" cascade="all"/>
</class>
</hibernate-mapping>
<class name="Car" table="car_fk">
<id name="id" column="id" type="integer">
<generator class="native" />
</id>
<one-to-one name="engine" class="Engine" property-ref="car" cascade="all"/>
</class>
</hibernate-mapping>
Engine.hbm.xml
<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>
<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)这里使用了property-ref属性,默认为关联类的主键属性名(java bean中的属性名)。
- Hibernate一对一的两种形式
- hibernate一对一的两种情况
- hibernate一对一的两种实现方法
- hibernate 一对一映射的两种方式
- hibernate映射详解:一对一映射的两种实现方式
- hibernate一对一配置两种方式
- hibernate 注解方式一对一 基于外键的形式
- Hibernate one-to-one的两种形式
- 表关系:一对一的两种方式
- mybatis 一对一的映射(两种方式)
- UIActivityIndicatorView的两种形式
- UIActivityIndicatorView的两种形式
- UIActivityIndicatorView的两种形式
- UIActivityIndicatorView的两种形式
- UIActivityIndicatorView的两种形式
- split 的两种形式
- UIActivityIndicatorView的两种形式
- #include的两种形式
- svn自动安装脚本
- EHCache
- [转]如何编写 INF 文件
- XUL介绍
- PKU ACM经典50题
- Hibernate一对一的两种形式
- 回答GB的问题~
- Asp.Net alert弹出提示信息的若干种方法
- 编码注意事项
- XUL Tutorial-第一章介绍
- 如何设置命令提示符窗口全屏
- 利用蒙特卡罗方法求积分
- Android 中的Intent在两个Acitvity传递数据示例
- 一步步学汇编(九)call & ret