实体 Manager
package entity; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="managers") @Entity public class Manager { private Integer id; private String mgrName; /** * 一对一关联关系 */ private Department department; @GeneratedValue(strategy=GenerationType.AUTO) @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="MGR_NAME") public String getMgrName() { return mgrName; } public void setMgrName(String mgrName) { this.mgrName = mgrName; } /** * 对于不维护关系的一方(没有外外键的一方) ,使用@OneToOne 来进行映射,建议设置mappedBy=true * 同时,使用了mappedBy属性,不能同时使用@JoinColumn,否组会抛出异常 * @return */ //@JoinColumn(name="MGR_ID") @OneToOne(mappedBy="manager",fetch=FetchType.LAZY) //不维护,使用对方的manager来维护 public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; } }
实体 Department
package entity; import static org.junit.Assert.assertTrue; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.OneToOne; import javax.persistence.Table; @Table(name="department") @Entity public class Department { private Integer id; private String deptName; private Manager manager; @GeneratedValue @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } /** * 使用@OnetoOne 映射一对一的关联关系 * 如要在当前表中添加主键。则需要使用@JoinColumn ,说明,一对一关系,需要添加unique=true * @return */ @JoinColumn(name="MGR_ID",unique=true ) @OneToOne public Manager getManager() { return manager; } public void setManager(Manager manager) { this.manager = manager; } @Column(name="DEPT_NAME") public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } }
测试 OneToOnetest
package test; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.persistence.FetchType; import javax.persistence.Persistence; import org.junit.After; import org.junit.Before; import org.junit.Test; import entity.Department; import entity.Manager; public class OneToOneTest { private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; private EntityTransaction entityTransaction; @Before public void init() { entityManagerFactory = Persistence.createEntityManagerFactory("JPA"); entityManager = entityManagerFactory.createEntityManager(); entityTransaction = entityManager.getTransaction(); entityTransaction.begin(); } @After public void distory() { entityTransaction.commit(); entityManager.close(); entityManagerFactory.close(); } /** * 若查找不维护的一方,默认也是通过左外链接获取其关联对象 * 可以通过 @OneToOne(fetch=FetchType.LAZY)来修改, *但是依然会发送sql语句来初始化其关联对象 ,不建议修改fetch属性 */ @Test public void testfind1(){ Manager manager = entityManager.find(Manager.class, 22); System.out.println(manager.getMgrName()); Department department = manager.getDepartment(); System.out.println(department.getDeptName()); } /** * 若查找维护的一方,默认也是通过左外链接获取其关联对象 *可以通过 @OneToOne(fetch=FetchType.LAZY)来修改 */ @Test public void testfind2(){ Department department = entityManager.find(Department.class, 21); System.out.println(department.getDeptName()); System.out.println(department.getManager().getMgrName()); } /** * 双向一对一关系,建议先保存不维护关系的一方(没有外键的),这样不会产生update语句 */ @Test public void testPersistence() { Manager manager = new Manager(); manager.setMgrName("AAA"); Department department = new Department(); department.setDeptName("BBB"); // set associate 设置关联 manager.setDepartment(department); department.setManager(manager); // 双向一对一关系,建议先保存不维护关系的一方(没有外键的),这样不会产生update语句 entityManager.persist(manager); entityManager.persist(department); } }