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


 

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

 


 public class Car implements Serializable
{
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>

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>

 

 

 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>

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>

 

a)这里使用了property-ref属性,默认为关联类的主键属性名(java bean中的属性名)。



原创粉丝点击