1、一对一的单向外键关联
例如有两个实体类Husband、Wife,其中husband中有三个属性id、name和Wife类型的wife;Wife中有三个属性id、name和age,那么在Husband中的注解如下(在Wife中
只需要进行实体和id的注解就行):
@Entity
public class Husband {
private int id;
private String name;
private Wife wife;
@Id
@GeneratedValue
public int getId() {
return id;
}
此处省略其他属性的get,set方法
@OneToOne
@JoinColumn(name="wife_id")
public Wife getWife() {
return wife;
}
public void setWife(Wife wife) {
this.wife = wife;
}
}
其中的红色注解@OneToOne表示一对一的外键关联,黑色加粗注解@JoinColumn(name="wife_id")为指定外键字段为wife_id。
2.一对一的双向外键关联
此时需要在Wife中增加一个Husband类型的husband属性,并生成get、set方法,在public Husband getHasband(){}上添加注解@OneToOne,但是此时会在数据库表中的
Husband和Wife中都会生成互相依赖对方的外键,产生数据冗余,这时候我们需要指定一方为主表,那么注解就可以这么写@OneToOne(mappedBy="wife"),其中
mappedBy指定的wife表示被Husband的getWife()中的wife映射。
3.一对一的单向主键关联(不重要,实际项目中用的很少很少)此时把1中@OneToOne、@JoinColumn(name="wife_id")改为@PrimaryKeyJoinColumn即可
4.一对一的双向主键关联(不重要,实际项目中几乎不用)与2中一样在Wife中增加一个Husband类型的husband属性,并生成get、set方法,在public Husband getHasband(){}
上添加注解@OneToOne和@PrimaryKeyJoinColumn
5.一对一的联合主键外键关联(用的不多)
还是之上的两个类,比如Wife中的id、name为联合主键,这时候需要给其建立一个主键类WifePK
public class WifePK implements Serializable{
private int id;
private String name;
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;
}
}
这时候需要在Husband类上边添加@IdClass(WifePK.class),wife属性上如下写注解
@OneToOne
@JoinColumns
(
{
@JoinColumn(name="wife_id",referencedColumnName="id"),
@JoinColumn(name="wife_name",referencedColumnName="name")
}
)
public Wife getWife() {
return wife;
}
接下来的一对多,多对一在下一篇介绍