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; }