如果要搭建JPA开发环境,请从JPA第一篇博客看起。
这里以员工和员工工号举例,讲解一对一的配置。
1、员工类Staff中的代码
package cn.sunft.bean;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToOne;
/**
* 员工
*/
@Entity
public class Staff {
private Integer id;
private String name;
private IDCard idCard;
public Staff() {
super();
}
public Staff(String name) {
super();
this.name = name;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 10, nullable = false)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@OneToOne(optional = false, cascade = { CascadeType.ALL })
@JoinColumn(name = "idcard_id") // 指定外键名称
public IDCard getIdCard() {
return idCard;
}
public void setIdCard(IDCard idCard) {
this.idCard = idCard;
}
}
package cn.sunft.bean;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.OneToOne;
/**
* 员工工号
*/
@Entity
public class IDCard {
private Integer id;
private String cardno;
private Staff staff;
public IDCard() {
super();
}
public IDCard(String cardno) {
super();
this.cardno = cardno;
}
@Id
@GeneratedValue
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(length = 16, nullable = false)
public String getCardno() {
return cardno;
}
public void setCardno(String cardno) {
this.cardno = cardno;
}
/**
* mappedBy:含有该属性的类是关系的被维护端
* 因为在维护关系的实体中已经指定了外键,
* 因此这里可以省略optional = false
* @return
*/
@OneToOne(mappedBy = "idCard", cascade = { CascadeType.PERSIST,
CascadeType.MERGE, CascadeType.REFRESH })
public Staff getStaff() {
return staff;
}
public void setStaff(Staff staff) {
this.staff = staff;
}
}
3、测试类中的代码
package junit.test;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import org.junit.Test;
import cn.sunft.bean.IDCard;
import cn.sunft.bean.Staff;
/**
* 测试JPA中的一对一操作
*/
public class OneToOneTest {
@Test
public void save() {
EntityManagerFactory factory = Persistence
.createEntityManagerFactory("sunft_first");
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
Staff staff = new Staff("老张");
staff.setIdCard(new IDCard("1234512345"));
// Staff维护关系,因此会级联保存IDCard
em.persist(staff);
em.getTransaction().commit();
em.close();
factory.close();
}
}