hibernate映射之外键一对一双向

数据模型

 

对象模型

 

对象模型

UserInfo 
    private int uid;
    private String uname;
    private boolean usex;
    private Login login;

 

 Login
    private int lid;
    private String lname;
    private String lpassword;
    private UserInfo userinfo;

 

xml配置:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.skyedu.bean">
    <class name="UserInfo" table="userinfo">
       <id name="uid" column="uid" length="32">
           <generator class="native"></generator>
       </id>
       <property name="uname" column="uname" length="32"></property>
       <property name="usex" column="usex" ></property>
       <one-to-one name="login" class="Login" property-ref="userinfo" ></one-to-one>
    </class>
</hibernate-mapping>

 

附录解释:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.skyedu.bean">
    <class name="Login" table="login">
       <id name="lid" column="lid">
         <!-- 主键id自动增长配置 -->
           <generator class="native"></generator>
       </id>
       <property name="lname" column="lname" length="30"></property>
       <property name="lpassword" column="lpassword" length="30" ></property>
       <many-to-one name="userinfo"  column="uid" class="UserInfo" not-null="true" unique="true"
        cascade="save-update" >
       </many-to-one>
    </class>
</hibernate-mapping>

附录解释:

测试:

    
    
    /**
     * @author weidan       2013-2-5 上午11:04:10
     * remark: 外键单项一对一关联增加
     */
    @Test
    public void TestSave(){
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        transaction.begin();
        try{
            UserInfo user = new UserInfo();
            user.setUname("魏丹");
            user.setUsex(true);
            
            Login login = new Login();
            login.setLname("weidan");
            login.setLpassword("weidan");
            login.setUserinfo(user);
            
            session.save(user);
            session.save(login);
            
            transaction.commit();
        }catch(Exception e){
            transaction.rollback();
        }finally{
            HibernateUtil.closeSession(session);
        }
        
    }
    
    
    /**
     * @author weidan       2013-2-5 上午11:04:37
     * remark: 单项一对一级联添加
     */
    @Test
    public void TestCascadeSave(){
        Session session = HibernateUtil.getSession();
        Transaction transaction = session.beginTransaction();
        transaction.begin();
        try{
            UserInfo user = new UserInfo();
            user.setUname("魏丹");
            user.setUsex(false);
            
            Login login = new Login();
            login.setLname("weidan");
            login.setLpassword("weidan");
            login.setUserinfo(user);
            
//            session.save(user);
            session.save(login);//只保存一个对象
            
            transaction.commit();
        }catch(Exception e){
            transaction.rollback();
        }finally{
            HibernateUtil.closeSession(session);
        }
        
    }
    
    
    
    @Test
    public void testFind(){
        Session session = HibernateUtil.getSession();
        Login login = (Login) session.get(Login.class, 8);
        System.out.println("loginName:"+login.getLname());
        System.out.println("loginPassword:"+login.getLpassword());
        System.out.println("userName:"+login.getUserinfo().getUid());
    }
    
    
    
    @Test
    public void testFind2(){
        Session session = HibernateUtil.getSession();
        UserInfo user = (UserInfo) session.get(UserInfo.class, 6);
        System.out.println("loginName:"+user.getLogin().getLname());
        System.out.println("loginPassword:"+user.getLogin().getLpassword());
        System.out.println("userName:"+user.getUid());
    }
    
    
    
    
    
    
    
//
//    public static void main(String[] args) {
//        HibernateUtil.createTable();
//    }
    
    

 

总结:

单项一对一外键关联和双向一对一外键关联比较:

  1. 数据模型完全相同
  2. 被唯一限制的多的一方的配置两个是完全一样的,但是在另一端是需要改变的需要加one-to-one
  3. 对象模型中少的一段需要改变加入对方的引用

 

 

 

posted @ 2013-02-04 12:50  虎猫  阅读(170)  评论(0编辑  收藏  举报