一对一关系需要在关系维护端(owner side)的@OneToOne注释中定义mappdBy属性,在关系被维护端(inverse side)建立外键列指向关系关系维护端的主键列。
关系被维护端 IDCard.java代码如下
@SuppressWarnings(
"
serial
"
)
@Entity
@Table(name = " IDCard " )
public class IDCard implements Serializable ... {
private Integer id;
private String cardno;
private Person person;
public IDCard() ...{
}
public IDCard(String cardno) ...{
this.cardno = cardno;
}
@Id
@GeneratedValue
public Integer getId() ...{
return id;
}
public void setId(Integer id) ...{
this.id = id;
}
@Column(nullable=false,length=18,unique = true)
public String getCardno() ...{
return cardno;
}
public void setCardno(String cardno) ...{
this.cardno = cardno;
}
//@JoinColumn列名为Person_ID作为外键 对应Person表的personid列
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = "Person_ID", referencedColumnName = "personid",unique = true)
public Person getPerson() ...{
return person;
}
public void setPerson(Person person) ...{
this.person = person;
}
}
@Entity
@Table(name = " IDCard " )
public class IDCard implements Serializable ... {
private Integer id;
private String cardno;
private Person person;
public IDCard() ...{
}
public IDCard(String cardno) ...{
this.cardno = cardno;
}
@Id
@GeneratedValue
public Integer getId() ...{
return id;
}
public void setId(Integer id) ...{
this.id = id;
}
@Column(nullable=false,length=18,unique = true)
public String getCardno() ...{
return cardno;
}
public void setCardno(String cardno) ...{
this.cardno = cardno;
}
//@JoinColumn列名为Person_ID作为外键 对应Person表的personid列
@OneToOne(optional = false, cascade = CascadeType.REFRESH)
@JoinColumn(name = "Person_ID", referencedColumnName = "personid",unique = true)
public Person getPerson() ...{
return person;
}
public void setPerson(Person person) ...{
this.person = person;
}
}
关系维护端代码Person.java
@SuppressWarnings(
"
serial
"
)
@Entity
/**/ /**
* name="Person" 表示数据库中表名为Person
* 如果省略此条注释,则数据库默认表明为Person 即类名
* 若想另外命名,可省略@Table
*
*/
@Table(name = " Person " )
public class Person implements Serializable ... {
//@Column列的注释可以放在定义属性前,也可以放在get方法前
private Integer personid;
/**//**
* @Column可以省略
* name = "PersonName"表示数据库里此表中的列名为PersonName, 省略的则为默认的name
* nullable = false表示是否此列容许空值
* length=32表示长度
*/
@Column(name = "PersonName",nullable=false,length=32)
private String name;
private boolean sex;
private Short age;
private Date birthday;
private IDCard idcard;
@Id
@GeneratedValue(strategy = GenerationType.AUTO) //(strategy = GenerationType.AUTO) 默认的,可以省略
public Integer getPersonid() ...{
return personid;
}
public void setPersonid(Integer personid) ...{
this.personid = personid;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
@Column(nullable=false)
public boolean getSex() ...{
return sex;
}
public void setSex(boolean sex) ...{
this.sex = sex;
}
@Column(nullable=false)
public Short getAge() ...{
return age;
}
public void setAge(Short age) ...{
this.age = age;
}
// @Temporal 表示对于时间的注释,因为有不同的时间格式表示方式
//@Temporal可以不用,系统将采取默认一种
@Temporal(value=TemporalType.DATE)
public Date getBirthday() ...{
return birthday;
}
public void setBirthday(Date birthday) ...{
this.birthday = birthday;
}
/**//**
* @OneToOne
* mappedBy = "person" 定义类之间双向关系,如果类之间是单向关系则不需要提供定义,若类与类之间有双向关系则一定钥匙此注释,否则造成数据不一致
* cascade 级联关系
* optional = true表示idcard属性可以null
* fetch 有FetchType.EAGER和FetchType.LAZY前者为主类加载同时加载,后者是表示关系类在被访问时才加载
*/
@OneToOne(optional = true,cascade = CascadeType.ALL, mappedBy = "person")
public IDCard getIdcard() ...{
return idcard;
}
public void setIdcard(IDCard idcard) ...{
this.idcard = idcard;
}
}
@Entity
/**/ /**
* name="Person" 表示数据库中表名为Person
* 如果省略此条注释,则数据库默认表明为Person 即类名
* 若想另外命名,可省略@Table
*
*/
@Table(name = " Person " )
public class Person implements Serializable ... {
//@Column列的注释可以放在定义属性前,也可以放在get方法前
private Integer personid;
/**//**
* @Column可以省略
* name = "PersonName"表示数据库里此表中的列名为PersonName, 省略的则为默认的name
* nullable = false表示是否此列容许空值
* length=32表示长度
*/
@Column(name = "PersonName",nullable=false,length=32)
private String name;
private boolean sex;
private Short age;
private Date birthday;
private IDCard idcard;
@Id
@GeneratedValue(strategy = GenerationType.AUTO) //(strategy = GenerationType.AUTO) 默认的,可以省略
public Integer getPersonid() ...{
return personid;
}
public void setPersonid(Integer personid) ...{
this.personid = personid;
}
public String getName() ...{
return name;
}
public void setName(String name) ...{
this.name = name;
}
@Column(nullable=false)
public boolean getSex() ...{
return sex;
}
public void setSex(boolean sex) ...{
this.sex = sex;
}
@Column(nullable=false)
public Short getAge() ...{
return age;
}
public void setAge(Short age) ...{
this.age = age;
}
// @Temporal 表示对于时间的注释,因为有不同的时间格式表示方式
//@Temporal可以不用,系统将采取默认一种
@Temporal(value=TemporalType.DATE)
public Date getBirthday() ...{
return birthday;
}
public void setBirthday(Date birthday) ...{
this.birthday = birthday;
}
/**//**
* @OneToOne
* mappedBy = "person" 定义类之间双向关系,如果类之间是单向关系则不需要提供定义,若类与类之间有双向关系则一定钥匙此注释,否则造成数据不一致
* cascade 级联关系
* optional = true表示idcard属性可以null
* fetch 有FetchType.EAGER和FetchType.LAZY前者为主类加载同时加载,后者是表示关系类在被访问时才加载
*/
@OneToOne(optional = true,cascade = CascadeType.ALL, mappedBy = "person")
public IDCard getIdcard() ...{
return idcard;
}
public void setIdcard(IDCard idcard) ...{
this.idcard = idcard;
}
}