分类: Java
2008-05-28 15:09:15
一、双向1-N的关系映射
对于1-N的关联,Hibernate推荐使用双向关联,但不用1的一端来控制关联关系,而使用N
的一端来控制关联关系。N的一端直接访问关联类属性;1的一端增加集合属性的访问。
看下面2个POJO
public class Person implements Serializable
...{
private int personid;
priavte String name;
private int age;
private Set addresses = new HashSet();
……
}
public class Address implements Serializable
...{
private int addressid;
private String addressdetail;
private Person person;
public Address() ...{}
public Address(Sring addressdetail) ...{
this.addressdetail = addressdetail;
}
}
1.无连接表的双向1-N关联
两个持久化类的配置文件都需要指定外键列的列名
xml version="1.0"?>
DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
<hibernate-mapping package="prolove">
<class name="Address">
<id name="addressid">
<generator class="identity"/>
id>
<property name="addressdetail"/>
<many-to-one name="person" column="personid"/>
class>
<class name="Person">
<id name="personid">
<generator class="identity"/>
id>
<property name="name"/>
<property name="age"/>
<set name="addresss">
<key column="personid"/>
<one-to-many class="Address"/>
set>
class>
hibernate-mapping>
2.有连接表的双向1-N关联
两边确定连接表的table属性值应该相同,且不能省略。
xml version="1.0"?>
DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
<hibernate-mapping package="prolove">
<class name="Address">
<id name="addressid">
<generator class="identity"/>
id>
<property name="addressdetail"/>
<join table="PersonAddress" inverse="true" optional="true">
<key column="addressid"/>
<many-to-one name="person" column="personid" not-null="true"/>
join>
class>
<class name="Person">
<id name="personid">
<generator class="identity"/>
id>
<property name="name"/>
<property name="age"/>
<set name="addresses" table="PersonAddress">
<key column="personid"/>
<one-to-many column="addressid" unique="true" class="Address"/>
set>
class>
hibernate-mapping>
二、双向N-N关联
public class Person
...{
private int personid;
private String name;
private int age;
private Set addresses = new HashSet();
……
}
public class Address
...{
private int addressid;
private String addressdetail;
private Set persons = new HashSet();
public Address() ...{}
public Address(String addressdetail) ...{
this.addressdetail = addressdetail;
}
}
xml version="1.0"?>
DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
<hibernate-mapping package="prolove">
<class name="Address">
<id name="addressid">
<generator class="identity"/>
id>
<property name="addressdetail"/>
<set name="persons" inverse="true" table="jointable">
<key column="addressid"/>
<many-to-many column="personid" class="Person"/>
set>
class>
<class name="Person">
<id name="personid">
<generator class="identity"/>
id>
<property name="name"/>
<property name="age"/>
<set name="addresses" table="jointable">
<key column="personid"/>
<many-to-many column="addressid" class="Address"/>
set>
class>
hibernate-mapping>
三、双向1-1关联
public class Person
...{
//基本属性
private int personid;
private String name;
private int age;
//关联属性
private Address address;
……
}
public class Address implements Serializable
...{
private int addressid;
private String addressdetail;
private Person person;
public Address() ...{}
public Address(String addressdetail) ...{
this.addressdetail = addressdetail;
}
……
}
1.基于外键的双向1-1关联
xml version="1.0"?>
DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
<hibernate-mapping package="prolove">
<class name="Person">
<id name="personid">
<generator class="identity"/>
id>
<property name="name"/>
<property name="age"/>
<one-to-one name="address" property-ref="person"/>
class>
<class name="Address">
<id name="addressid">
<generator class="identity"/>
id>
<property name="addressdetail"/>
<many-to-one name="person" unique="true"/>
class>
hibernate-mapping>
2.基于主键的双向1-1关联
xml version="1.0"?>
DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
<hibernate-mapping package="prolove">
<class name="Person">
<id name="personid">
<generator class="identity"/>
id>
<property name="name"/>
<property name="age"/>
<one-to-one name="address"/>
class>
<class name="Address">
<id name="addressid">
<generator class="foreign">
<param name="property">personparam>
generator>
id>
<property name="addressdetail"/>
<one-to-one name="person" constrained="true"/>
class>
hibernate-mapping>
3.有连接表的双向1-1关联
本情形相当罕见,通常不推荐使用这种策略。
xml version="1.0"?>
DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"">
<hibernate-mapping package="prolove">
<class name="Person">
<id name="personid">
<generator class="identity"/>
id>
<property name="name"/>
<property name="age"/>
<join table="PersonAddress" optional="true">
<key column="personid" unique="true"/>
<many-to-one name="address" column="addressid"
not-null="true" unique="true"/>
join>
class>
<class name="Address">
<id name="addressid">
<generator class="identity"/>
id>
<property name="addressdetail"/>
<join table="PersonAddress" inverse="true" optional="true">
<key column="addressid" unique="true"/>
<many-ton-one name="person" column="personid"
not-null="true" unique="true"/>
join>
class>
hibernate-mapping>