hibernate annotation 双向 one-to-one 注解

Java代码   收藏代码
  1. package com.hibernate.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.OneToOne;  
  9.   
  10. @Entity  
  11. public class Husband implements Serializable {  
  12.       
  13.       
  14.     /** 
  15.      *  
  16.      */  
  17.     private static final long serialVersionUID = 2476364405175138004L;  
  18.   
  19.       
  20.     private int id;  
  21.       
  22.     private String name;  
  23.       
  24.     private Wife wife;  
  25.       
  26.       
  27.     @Id  
  28.     @GeneratedValue  
  29.     public int getId() {  
  30.         return id;  
  31.     }  
  32.   
  33.     public String getName() {  
  34.         return name;  
  35.     }  
  36.   
  37.     @OneToOne  
  38.     public Wife getWife() {  
  39.         return wife;  
  40.     }  
  41.   
  42.     public void setId(int id) {  
  43.         this.id = id;  
  44.     }  
  45.   
  46.     public void setName(String name) {  
  47.         this.name = name;  
  48.     }  
  49.   
  50.     public void setWife(Wife wife) {  
  51.         this.wife = wife;  
  52.     }  
  53.       
  54.       
  55. }  

 

 

Java代码   收藏代码
  1. package com.hibernate.entity;  
  2.   
  3. import java.io.Serializable;  
  4.   
  5. import javax.persistence.Entity;  
  6. import javax.persistence.GeneratedValue;  
  7. import javax.persistence.Id;  
  8. import javax.persistence.OneToOne;  
  9.   
  10. @Entity  
  11. public class Wife implements Serializable {  
  12.       
  13.     /** 
  14.      *  
  15.      */  
  16.     private static final long serialVersionUID = 5270130768836331730L;  
  17.   
  18.       
  19.     private int id;  
  20.       
  21.     private String name;  
  22.       
  23.     private Husband husband;  
  24.   
  25.       
  26.     @Id  
  27.     @GeneratedValue  
  28.     public int getId() {  
  29.         return id;  
  30.     }  
  31.   
  32.     public void setId(int id) {  
  33.         this.id = id;  
  34.     }  
  35.   
  36.     public String getName() {  
  37.         return name;  
  38.     }  
  39.   
  40.     public void setName(String name) {  
  41.         this.name = name;  
  42.     }  
  43.   
  44.     @OneToOne(mappedBy="wife")  
  45.     public Husband getHusband() {  
  46.         return husband;  
  47.     }  
  48.   
  49.     public void setHusband(Husband husband) {  
  50.         this.husband = husband;  
  51.     }  
  52.       
  53. }  
 

注意:Wife类的getHusband()上用了mappedBy"wife"

这个意思是说,我这里的OneToOne就不用管了,只用Husband里的getWife()上的OneToOne关系

生成的表为Husband参考Wife,有了wifeid,才能有Husband

Husband为这个关系的拥有者

 

如果Wife类的getHusband()只有@OneToOne,没有mappedBy,那么生成的两张表都会有对方的外键,造成外键冗余。


Test.java

package com.fancy.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
import com.fancy.po.Card;
import com.fancy.po.Person;
/**
 * -----------------------------------------
 * @文件: Test.java
 * @作者: fancy
 * @邮箱: [email protected]
 * @时间: 2012-6-10
 * @描述: 测试类
 * -----------------------------------------
 */
public class Test {

    public static void main(String[] args) {
        
        //读取hibernate配置,默认读取classpath下的hibernate.cfg.xml
        Configuration conf = new AnnotationConfiguration();    
        //构建session工厂
         SessionFactory sessionFactory = conf.configure().buildSessionFactory();
        //打开session
        Session session = sessionFactory.openSession();
        //开始事务
         session.beginTransaction();
        // * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        //test1(session);    //测试 1
        //test2(session);    //测试 2
        test3(session);      //测试 3
        // * * * * * * * * * * * * * * * * * * * * * * * * * * * *
        //提交事务
         session.getTransaction().commit();
        //关闭session工厂
         sessionFactory.close();
       //关闭session
       session.close();
    }
    /**
     * 数据库初始值:
      * personName:fancy
     * cardNumber:440911199008011122
     */
    //测试方法1
    public static void test1(Session session){
        Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
         Card card = person.getCard();
        System.out.println(person.getPersonName());
        System.out.println(card.getCardNumber());
        person.setPersonName("fancy");            //与初始值一致
         card.setCardNumber("440911199008011122");//与初始值一致
         session.save(person);    //不发出sql语句
       //session.save(card);     //不发出sql语句
    }
    //测试方法2
    public static void test2(Session session){
        Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
         Card card = person.getCard();
        System.out.println(person.getPersonName());
        System.out.println(card.getCardNumber());
        person.setPersonName("fancyzero");        //与初始值不一致
         card.setCardNumber("440911199008011122");//与初始值一致
         session.save(person);    //发出Person的update语句,数据库中personName被修改,不发出Card的update语句
       //session.save(card);     //发出Person的update语句,数据库中personName被修改,不发出Card的update语句
    }
    //测试方法3
    public static void test3(Session session){
        Person person = (Person)session.get(Person.class, 1); //发出Person和Card的select语句
         Card card = person.getCard();
        System.out.println(person.getPersonName());
        System.out.println(card.getCardNumber());
        person.setPersonName("fancy");           //与初始值不一致
         card.setCardNumber("440911199008080808");//与初始值不一致
         session.save(person);    //同时发出Person和Card的update语句,数据库中的数据相应被修改
       //session.save(card);     //同时发出Person和Card的update语句,数据库中的数据相应被修改
    }
}



你可能感兴趣的:(hibernate annotation 双向 one-to-one 注解)