zoukankan      html  css  js  c++  java
  • Hibernate!!一对一关联映射

    one-to-one 

     一对一......单向外键关联

    1)annotation方式: 在加入外键(即加入引用的一方)的实体类的类名上加@Entity ; 在主键的get方法上加@id @GeneratedValue ; 

      在体现关系的外键属性上加 @onetoone 和  @JoinColumn(name=”添加的外键的名字“,不写的话就是自动生成的名字)

    package com.hb.model;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    
    @Entity
    public class Wife {
        private  int  id ;
        private  String  name ;
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
    
      ....
      
    }
    package com.hb.model;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.JoinColumn;
    import javax.persistence.OneToOne;
    
    
    @Entity
    public class Husband {
        private  int  id ;
        private  String  name ;
        private  Wife   wife ;
        
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        
        public String getName() {
            return name;
        }
        
        @OneToOne
        @JoinColumn(name="wifeId")
        public Wife getWife() {
            return wife;
        }
        public void setId(int id) {
            this.id = id;
        }...
    
    } 

    2)在xml中,用到<many-to-one    unique="true">

    public class Student {
        
        private  int  id ;
        private   String  age ;    
        private  String  name ;
        // get、set方法省略
    public class StuIdCard {
        private  int  id ;
        private  String  num ;
        private  Student  student ;
        // get、set方法省略

    StuIdCard.hbm.xml如下:

    <hibernate-mapping  package="com.hb.model">
        <!-- 映射表 和 类 -->
        <class  name="com.hb.model.StuIdCard">
            <id name="id"  column="id">
                <generator class="native"></generator>
            </id>
            <!--  映射具体的属性 -->
            <property name="num"  column="num"></property>
            <many-to-one name="student"  column="studentId" unique="true"></many-to-one>
        </class>
       
    </hibernate-mapping>

     

     一对一.......双向外键关联

    1)annotation方式: 在两个实体类上均加入对方的引用,但是在单项的基础上,在加入的新的引用的实体类上加@onetoone(mappedBy=“另一个实体类的关于此类的引用的属性名”)

    规律:凡是双向关联,必设mappedBy,表示被对方设置,即在数据库中,只有对方存在一个外键,防止冗余。

    @Entity
    public class Wife {
        private  int  id ;
        private  String  name ;
        private  Husband  husband ;
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }    
        @OneToOne(mappedBy="wife")
        public Husband getHusband() {
            return husband;
        }
    @Entity
    public class Husband {
        private  int  id ;
        private  String  name ;
        private  Wife   wife ;
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        
        @OneToOne
        @JoinColumn(name="wifeId")
        public Wife getWife() {
            return wife;
        }
        

    2)xml方式:用到<many-to-one    unique="true">  用到<one-to-one    property-ref="XXXX"> ,不是很懂

    <hibernate-mapping  package="com.hb.model">
        <!-- 映射表 和 类 -->
        <class  name="com.hb.model.StuIdCard">
            <id name="id"  column="id">
                <generator class="native"></generator>
            </id>
            <!--  映射具体的属性 -->
            <property name="num"  column="num"></property>
            <many-to-one name="student"  column="studentId" unique="true"></many-to-one>
        </class>
       
    </hibernate-mapping>
    <hibernate-mapping  package="com.hb.model">
        <!-- 映射表 和 类 -->
        <class  name="com.hb.model.Student">
            <id name="id"  column="id">
                <generator class="native"></generator>
            </id>
            <!--  映射具体的属性 -->
            <property name="name"  column="name"></property>
            <property name="age"  column="age"></property>

    <one-to-one name="stuIdCard" property-ref="student"></one-to-one> </class> </hibernate-mapping>

     一对一......单向主键关联 (主键关联用的很少,不重要)

    1)annotation方式: 在加入外键(即加入另一个类引用的一方)的实体类的类名上加@Entity ; 在主键的get方法上加@id @GeneratedValue ; 在体现关系的外键属性上加 @onetoone 和  @@PrimaryKeyJoinColumn

    注:但是在数据库中没有任何关联,不知道为什么

    @Entity
    public class Husband {
        private  int  id ;
        private  String  name ;
        private  Wife   wife ;
        
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
            
        @OneToOne
        @PrimaryKeyJoinColumn
        public Wife getWife() {
            return wife;
        }
        
    @Entity
    public class Wife {
        private  int  id ;
        private  String  name ;
        private  int  age ;
        
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }

     2)xml方式:其中一个映射文件用到<one-to-one    name="XXX"> 

      另一个映射文件用到<one-to-one    name="XXXX"  constrained=“true”>此的文件的主键的生成策略也要改变

     一对一......双向主键关联 (主键关联用的很少,不重要)

     annotation方式:

    @Entity
    public class Husband {
        private int id;
        private String name;
        private Wife wife;
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        
        public String getName() {
            return name;
        }
        @OneToOne
        @PrimaryKeyJoinColumn
        public Wife getWife() {
            return wife;
        }
    @Entity
    public class Wife {
        private int id;
        private String name;
        private Husband husband;
        @OneToOne
        @PrimaryKeyJoinColumn
        public Husband getHusband() {
            return husband;
        }
        public void setHusband(Husband husband) {
            this.husband = husband;
        }
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }

    联合主键

    常用的一种方法是:将符合主键单独写成一个类,称之为复合主键类,此类就是一个普通的类,无需任何注释,但是要继承Serializable接口,重写equals()和hashCode()方法。

    其它的类的属性无需修改。

    在含有复合主键的实体类上加上@IdClass     @IdClass标注复合主键类

    在加入关系属性的实体类上加上 @OneToOne  和 @JoinColumns (此方法的属性是一个数组)

    public class WifePK implements Serializable {
        private int id;
        private String name;
        //get、set 方法省略
        //重写equals()和hashCode()方法
    @Entity
    @IdClass(value=WifePk.class)  //标注复合主键类
    public class Wife {
        private  int  id ;
        private  String  name ;
        private  int  age ;
        
        
        @Id
        public int getId() {
            return id;
        }
        @Id
        public String getName() {
            return name;
        }
    @Entity
    public class Husband {
        private  int  id ;
        private  String  name ;
        private  Wife   wife ;
        
        
        @Id
        @GeneratedValue
        public int getId() {
            return id;
        }
        
        @OneToOne
        @JoinColumns(
                {
                    @JoinColumn(name="wifeId", referencedColumnName="id") ,
                    @JoinColumn(name="wifeName" , referencedColumnName="name")
                }
        )//这是一个数组,表示复合主键的名字还有对应的是类的属性
        public Wife getWife() {
            return wife;
        }
        
  • 相关阅读:
    C#下实现ping功能
    Telnet Chat Daemon
    ADO.NET连接池
    很好使的MAIL CLASS
    实例看多态
    完整的TCP通信包实现
    使用C#进行点对点通讯和文件传输(通讯基类部分)(转)
    特洛伊木马服务器源代码(C#)
    [C#] 如何选择一个目录
    如何使用C#压缩文件及注意的问题!
  • 原文地址:https://www.cnblogs.com/Mokaffe/p/4155007.html
Copyright © 2011-2022 走看看