hibernate annotation 双向 one-to-one 注解

来源:互联网 发布:三维建筑设计软件 编辑:程序博客网 时间:2024/05/21 11:33
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 * @邮箱: fancyzero@yeah.net * @时间: 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语句,数据库中的数据相应被修改    }}



原创粉丝点击