Hibernate一对一数据关联(一)

对于ORM而言,一个重要的特性就是对实体之间关联关系的管理。数据关联是ORM一个重要的特征,但往往也是导致性能低下的原因,在开发中要特别注意这一点。

一对一关联有两种类型:主键关联和唯一外键关联

一.主键关联:
一对一主键关联形式,即两张关联表通过主键形成一对一映射关系。
例如,一个中国公民只能有一份护照。

1.数据模型如下



2.表定义sql

DROP   TABLE  T_User;
DROP   TABLE  T_Passport;

CREATE   TABLE  T_Passport (
       id 
INT   NOT   NULL
     , serial 
VARCHAR ( 30 )
     , expiry 
INT
     , 
PRIMARY   KEY  (id)
);

CREATE   TABLE  T_User (
       id 
INT   NOT   NULL  AUTO_INCREMENT
     , name 
VARCHAR ( 50 )
     , age 
INT
     , 
PRIMARY   KEY  (id)
     , 
INDEX  (id)
     , 
CONSTRAINT  FK_T_User_1  FOREIGN   KEY  (id)
                  
REFERENCES  T_Passport (id)
);



3.POJO类
TUser.java
package cn.blogjava.start;

public class TUser  implements java.io.Serializable {
    
// Fields    
     private Integer id;
     
private Integer age;
     
private String name;
     
private TPassport passport;


    
// Constructors

    
public Integer getAge() {
        
return age;
    }

    
public void setAge(Integer age) {
        
this.age = age;
    }

    
public TPassport getPassport() {
        
return passport;
    }

    
public void setPassport(TPassport passport) {
        
this.passport = passport;
    }

    
/** default constructor */
    
public TUser() {
    }
    
    
/** constructor with id */
    
public TUser(Integer id) {
        
this.id = id;
    }
    
// Property accessors

    
public Integer getId() {
        
return this.id;
    }
    
    
public void setId(Integer id) {
        
this.id = id;
    }

    
public String getName() {
        
return this.name;
    }
    
    
public void setName(String name) {
        
this.name = name;
    }

}

TPassport.java
package cn.blogjava.start;

import java.io.Serializable;

public class TPassport implements Serializable {
    
private Integer id;
    
private String serial;
    
private Integer expiry;
    
private TUser user;
    
    
public Integer getExpiry() {
        
return expiry;
    }
    
public void setExpiry(Integer expiry) {
        
this.expiry = expiry;
    }
    
public Integer getId() {
        
return id;
    }
    
public void setId(Integer id) {
        
this.id = id;
    }
    
public String getSerial() {
        
return serial;
    }
    
public void setSerial(String serial) {
        
this.serial = serial;
    }
    
public TUser getUser() {
        
return user;
    }
    
public void setUser(TUser user) {
        
this.user = user;
    }
    
}

3.配置文件
TUser.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping>
    
<class name="cn.blogjava.start.TUser" table="T_User" catalog="sample">
        
<id name="id" type="integer">
            
<column name="id" />
            
<generator class="native" />
        
</id>
        
<property name="name" type="string">
            
<column name="name" length="100" not-null="true" />
        
</property>
        
<property name="age" type="java.lang.Integer" column="age" />
        
<one-to-one name="passport" 
                    class
="cn.blogjava.start.TPassport"
 
                    cascade
="all"
 
                    outer-join
="true"
 
         
/>

    
</class>
</hibernate-mapping>

TPassport.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"
>
<hibernate-mapping>
    
<class name="cn.blogjava.start.TPassport" table="T_Passport" catalog="sample">
        
<id name="id" type="integer" column="id">
            
<generator class="foreign">
                
<param name="property">user</param>
            
</generator>           
        
</id>

        
<property name="serial" type="string" column="serial" />
        
<property name="expiry" type="java.lang.Integer" column="expiry" />
        
        
<one-to-one name="user" 
                    class
="cn.blogjava.start.TUser"
 
                    constrained
="true"

         
/>
    
</class>
</hibernate-mapping>

4.测试代码
package cn.blogjava.start;

import java.util.List;

import junit.framework.Assert;
import junit.framework.TestCase;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;


public class HibernateTest extends TestCase {
    
    Session session 
= null;
    protected void setUp() {
        
try {

            Configuration config = new Configuration().configure();
            SessionFactory sessionFactory 
= config.buildSessionFactory();
            session 
= sessionFactory.openSession();
            
        } 
catch (HibernateException e) {
            e.printStackTrace();
        }        
    }

    protected void tearDown() {
        
try {
            session.close();        
        } 
catch (HibernateException e) {
           e.printStackTrace();
        }        
    }    
    
    public void testInsert() {
        Transaction tran 
= null;
        
try {
        
            TUser user 
= new TUser();
            user.setName(
"byf");
            user.setAge(
new Integer(26));
            
            TPassport passport 
= new TPassport();
            passport.setSerial(
"PCN123456");
            passport.setExpiry(
new Integer(20081010));
            
            
//设置相互关联
            user.setPassport(passport);
            passport.setUser(user);

            tran 
= session.beginTransaction();
            session.save(user);
            session.flush();
            tran.commit();
            Assert.assertEquals(user.getId().intValue()
>0 ,true);
        } 
catch (HibernateException e) {
            e.printStackTrace();
            Assert.fail(e.getMessage());
            
if(tran != null) {
                
try {
                    tran.rollback();
                } 
catch (Exception e1) {
                    e1.printStackTrace();
                }
            }
        }
    }
    
    
/**
     * 对象读取测试(Select方法)
     
*/            
    
public void testSelect(){
        String hql 
= " from TUser where name='byf'";
        
try {
            List userList 
= session.createQuery(hql).list();
            TUser user 
= (TUser)userList.get(0);
            System.out.println(
"user name is " + user.getName());
            System.out.println(
"passport serial NO. is " + user.getPassport().getSerial());
            Assert.assertEquals(user.getName(), 
"byf");
        } 
catch (Exception e) {
            e.printStackTrace();
            Assert.fail(e.getMessage());
        }
    }
}

posted on 2006-07-03 16:37 baim 阅读(562) 评论(0)  编辑  收藏 所属分类: 开源软件框架


只有注册用户登录后才能发表评论。


网站导航:
 
<2006年7月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

常用链接

随笔分类(27)

随笔档案(28)

搜索

最新评论