JPA系列七:映射关联关系-双向一对一

1、创建实体类Department

@Table(name="JPA_DEPARTMENTS")
@Entity
public class Department {

	private Integer id;
	private String deptName;
	
	private Manager mgr;

	@GeneratedValue
	@Id
	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	@Column(name="DEPT_NAME")
	public String getDeptName() {
		return deptName;
	}

	public void setDeptName(String deptName) {
		this.deptName = deptName;
	}

	//使用 @OneToOne 来映射一对一关联关系。
	//若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射. 注意, 一对一关联关系, 所以需要添加 unique=true
	@JoinColumn(name="MGR_ID", unique=true)
	@OneToOne(fetch=FetchType.LAZY)
	public Manager getMgr() {
		return mgr;
	}

	public void setMgr(Manager mgr) {
		this.mgr = mgr;
	}
}

2、创建实体类Manager

@Table(name="JPA_MANAGERS")
@Entity
public class Manager {

	private Integer id;
	private String mgrName;
	
	private Department dept;

	@GeneratedValue
	@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 属性指定由谁来维护关联关系
	@OneToOne(mappedBy="mgr")
	public Department getDept() {
		return dept;
	}

	public void setDept(Department dept) {
		this.dept = dept;
	}
}

3、在persistence.xml中配置

 <!-- 添加持久化类 -->
 <class>com.atguigu.jpa.helloworld.Department</class>
 <class>com.atguigu.jpa.helloworld.Manager</class>

4、测试:

//双向一对一的关联关系, 建议先保存不维护关联关系的一方, 即没有外键的一方, 这样不会多出 UPDATE 语句.
@Test
public void testOneToOnePersistence(){
	Manager mgr = new Manager();
	mgr.setMgrName("M-BB");
	Department dept = new Department();
	dept.setDeptName("D-BB");
	//设置关联关系
	mgr.setDept(dept);
	dept.setMgr(mgr);
	//执行保存操作
	entityManager.persist(mgr);
	entityManager.persist(dept);
}

在这里插入图片描述

//默认情况下, 若获取维护关联关系的一方, 则会通过左外连接获取其关联的对象. 
//但可以通过 @OntToOne 的 fetch 属性来修改加载策略.
@Test
public void testOneToOneFind(){
	Department dept = entityManager.find(Department.class, 1);
	System.out.println(dept.getDeptName());
	System.out.println(dept.getMgr().getClass().getName());
}	

在这里插入图片描述

//默认情况下, 若获取不维护关联关系的一方, 则也会通过左外连接获取其关联的对象. 
//可以通过 @OneToOne 的 fetch 属性来修改加载策略. 但依然会再发送 SQL 语句来初始化其关联的对象
//这说明在不维护关联关系的一方, 不建议修改 fetch 属性. 
@Test
public void testOneToOneFind2(){
	Manager mgr = entityManager.find(Manager.class, 1);
	System.out.println(mgr.getMgrName());
	System.out.println(mgr.getDept().getClass().getName());
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值