关于关系的一些基本知识点,请查看总结篇:Hibernate 关系映射
由于单向一对一的主键关联很少使用,不再示例,下面实例为单向一对一外键关联。
Annotation方式:
对象模型:一Husband 对一 wife ,且此时Husband为主导方
只需要在主导方(Husband)使用 @One2One @JoinColumn
@JoinColumn(name="wifeId")表示,在husband表中有一外键wifeid
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; }
public void setName(String name) { this.name = name; }
public void setWife(Wife wife) { this.wife = wife; }
}
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; }
public String getName() { return name; }
public void setId(int id) { this.id = id; }
public void setName(String name) { this.name = name; }
}
xml方式:
学生(主导方)和学生证一对一关系,只需在StudentCard.hbm.xml(即被主导方的表)中添加<many-to-one></many-to-one>
public class Student {
private int id;
private int age;
private String name;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void setStudentCard(StudentCard studentCard) {
this.studentCard = studentCard;
}
public StudentCard getStudentCard() {
return studentCard;
}
}
public class StudentCard {
private int id;
private String name;
private Student student;
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Student getStudent() { return student; }
public void setStudent(Student student) { this.student = student; }
}
下面配置xml文件:
student.hbm.xml:
<hibernate-mapping>
<class name="com.zyh.hibernate.Student" table="student">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<property name="name" column="name" />
<property name="age" column="age" />
</class>
</hibernate-mapping>
StudentCard.hbm.xml:
<hibernate-mapping>
<class name="com.zyh.hibernate.StudentCard" table="studentcard">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<many-to-one name="student" column="stuid" unique="true"></many-to-one>
</class>
</hibernate-mapping>
column属性是指数据库表中外键名称
unique="true"是保证生成的字段唯一,这样<many-to-one>也达到了一对一的效果
特别说明:
一对一单向外键关联与一对一双向外键关联在数据库的表的格式是一样的区别在于程序中双向外键关联可通过Hibernate在两个类间互相调用彼此而单向外键关联只能单方向调用.