实体关系是指实体与实体之间的关系,从方向上分为单向关联和双向关联,从实体数量上分为一对一、一对多、多对多等。对于任何两个实体,都要从这两个方面区分它们之间的关系。
单向关联是一个实体中引用了另外一个实体,也即通过一个实体可以获取另一个实体对象的引用;双向关联是两个实体之间可以相互获取对方对象的引用。
1、一对一
学生和身份证是一对一的关系,下面将从单向关联和双向关联来分析。
1.1、单向关联
假设在学生实体中可以获取身份证对象的引用;反之,不能在身份证实体中获取学生对象的引用,则学生和身份证是一对一的单向关联关系,关系映射如下:
@Entity
@Table(name="t_IDCard")
public class IDCard implements Serializable
{
private static final long serialVersionUID = 1L;
private Stringnum;
public IDCard()
{
}
@Id
@GeneratedValue
public String getNum()
{
return num;
}
public void setNum(String num)
{
this.num =num;
}
/*
* ....
* */
}
@Entity
@Table(name="t_student")
public class Student implements Serializable
{
private static final long serialVersionUID = 1L;
private int id;
private IDCardidCard;
public Student(){}
@Id
@GeneratedValue
public int getId()
{
return id;
}
public void setId(intid)
{
this.id =id;
}
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn(name="IDCrad_id")
public IDCardgetIdCard()
{
return idCard;
}
public void setIdCard(IDCard idCard)
{
this.idCard =idCard;
}
/*
* ....
* */
}
@OneToOne只能确定实体与实体的关系是一对一的关系,不能指定数据库表中的保存的关联字段,所以要结合@JoinColumn来指定关联字段。
在默认情况下,关联实体(IDCard)的主键一般是用来做外键的。但如果此时不想将关联实体的主键作为外键,而是将其他字段作为关联字段(外键可以关联到其他表的主键上,也可以关联到其他表的非空字段上),此时需要设置@JoinColumn的referencedColumnName属性。
1.2、双向关联
@Entity
@Table(name="T_IDCARD")
public class IDCard implements Serializable
{
private static final long serialVersionUID = 1L;
private Stringnum;
private Studentstudent;
public IDCard()
{
}
@Id
@GeneratedValue
public String getNum()
{
return num;
}
public void setNum(String num)
{
this.num =num;
}
@OneToOne(mappedBy="idCard")
public StudentgetStudent()
{
return student;
}
public void setStudent(Student student)
{
this.student =student;
}
/*
* ....
* */
}
@Entity
@Table(name="T_STUDENT")
public class Student implements Serializable
{
private static final long serialVersionUID = 1L;
private int id;
private IDCardidCard;
public Student(){}
@Id
@GeneratedValue
public int getId()
{
return id;
}
public void setId(intid)
{
this.id =id;
}
@OneToOne(cascade=CascadeType.ALL)
@JoinColumn