Chinaunix首页 | 论坛 | 博客
  • 博客访问: 30479040
  • 博文数量: 708
  • 博客积分: 12163
  • 博客等级: 上将
  • 技术积分: 8240
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-04 20:59
文章分类

全部博文(708)

分类: 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>
阅读(1662) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~