8、JPA-映射-双向一对一
一个管理对应一个部门,一个部门对应一个管理,例中由部门维护关联关系
Department:部门类
import lombok.Data; import javax.persistence.*; @Data
@Entity
@Table(name = "OneToOne_DEPARTMENTS")
public class Department { @Id
@GeneratedValue
private Integer id; @Column(name = "DEPT_NAME")
private String deptName; // 使用 @OneToOne 来映射 1-1 关联关系
// 若需要在当前数据表中添加主键则需要使用 @JoinColumn 来进行映射
// 1-1 关联关系, 需要添加 unique=true
@OneToOne()
@JoinColumn(name = "MGR_ID", unique = true)
private Manager mgr;
}
Manager:管理类
import lombok.Data; import javax.persistence.*; @Data
@Entity
@Table(name = "OneToOne_MANAGERS")
public class Manager { @Id
@GeneratedValue
private Integer id; @Column(name = "MGR_NAME")
private String mgrName; // 对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy,减少update语句
@OneToOne(mappedBy = "mgr")
private Department dept;
}
测试
添加
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; public class JPAyingshe {
private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction transaction; @Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("jpaname");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
} @After
public void destroy() {
transaction.commit();
entityManager.close();
entityManagerFactory.close();
} // 双向 1-1 的关联关系, 建议先保存不维护关联关系的一方, 即没有外键的一方, 这样不会多出 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, 33);
System.out.println(dept.getDeptName());
System.out.println(dept.getMgr().getClass().getName());
}

修改加载策略
@JoinColumn(name = "MGR_ID", unique = true)
@OneToOne(fetch = FetchType.LAZY)
public Manager getMgr() {
return mgr;
}

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

修改加载策略
// 对于不维护关联关系, 没有外键的一方, 使用 @OneToOne 来进行映射, 建议设置 mappedBy,减少update语句
@OneToOne(mappedBy = "mgr",fetch = FetchType.LAZY)
public Department getDept() {
return dept;
}

@PrimaryKeyJoinColumn
基于主键映射
8、JPA-映射-双向一对一的更多相关文章
- 9、JPA_映射双向一对一的关联关系
双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系.则Manager实体类中有Department实体对象的引用,反之亦然. 其实体属性定义如下: Lis ...
- JPA(七):映射关联关系------映射双向多对一的关联关系
映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone; import java.util.Date; import java. ...
- JPA中实现双向一对一的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- Hibernate学习(二补充)关系映射----基于外键的双向一对一
刚刚写的是基于外键的单向一对一. 那么双向一对一就是在单向一对一的基础上稍微改动就可以了. account.java和account.hbm.xml都不用变动 只要我们小小的变动address.j ...
- Hibernate 基于外键的双向一对一关联映射
之前简单介绍了基于外键的单项一对一的关联映射关系,本文简单介绍基于外键的双向一对一的关联映射. 1.设计表结构 表结构对于双向一对一来说没有多少改变,只是双向都可以获取到对方. 2.创建Person对 ...
- Hibernate关系映射(二) 基于外键的双向一对一
基于外键的双向一对一关联映射 需要在一端添加<one-to-one>标签,用property-ref来指定反向属性引用. 还是通过刚才用户和地址来演示双向一对一关联. 代码演示 一.实体类 ...
- java之hibernate之基于主键的双向一对一关联映射
这篇 基于主键的双向一对一关联映射 1.依然考察人和身份证的一对一关系,如果采用主键关联,那么其表结构为: 2.类结构 Person.java public class Person implemen ...
- java之hibernate之基于外键的双向一对一关联映射
这篇讲解 基于外键的双向一对一关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 2.类结构 Person.java public class Person implements ...
- 双向一对一映射@OneToOne
双向一对一的实例我已经上传到GitHub,entrance项目上了,感兴趣的可以下载下来跑跑,这里讲两个在运行过程中遇到的问题. 问题一:上一篇博客的最后我留下了问题.一对一关联查询注解@OneToO ...
- 10、JPA_映射双向多对多的关联关系
双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对 ...
随机推荐
- C#-ToString格式化
Int.ToString(format): 格式字符串采用以下形式:Axx,其中 A 为格式说明符,指定格式化类型,xx 为精度说明符,控制格式化输出的有效位数或小数位数,具体如下: 格式说明符 说明 ...
- Neo4j学习案例【转】
转自 打怪的蚂蚁 CSDN: https://blog.csdn.net/xgjianstart/article/details/77285334 neo4j有社区版本和企业版.社区版本是免费的,只支 ...
- Log4Net日志配置
1.添加Log4net.dll引用 将release版Log4net.dll拷贝到Lib文件夹,然后添加引用.
- ASP.NET MVC自定义异常处理
1.自定义异常处理过滤器类文件 新建MyExceptionAttribute.cs异常处理类文件
- ESXi内虚拟机带快照与不带快照的情况下简单性能对比.
1. 两个虚拟机配置相同都为2vCPU 8G内存 一个虚拟机内包含较多的快照且有内容梗概 一个虚拟机不包含快照直接只有一个虚拟机的vmdk磁盘文件 操作系统未windows server 2008r2 ...
- python删除数组元素导致跳过元素
复现的情况大概可以写成这样 abc = [1, 2, 2, 3, 4] print abc for index, i in enumerate(abc): if i == 2: del abc[ind ...
- js實現
js的代碼寫在<script></script>中: <script></script>可以放在body中或者head中,如果放在body中,一般放在b ...
- [转载]使用VS2015搭建Lua开发环境
参考原文请看: Lua学习笔记1:Windows7下使用VS2015搭建Lua开发环境(一) Lua学习笔记2:Windows7下使用VS2015搭建Lua开发环境(二) 本篇主要分以下几个部分: 一 ...
- Luogu3297 SDOI2013逃考(半平面交+最短路)
把每个人的监视范围看成点,相邻的两个监视范围连边,那么跑一遍最短路就可以了(事实上边权都为1可以直接bfs).显然存在最优路线没有某个时刻同时被多于两人监视,要到达另一个区域的话完全可以经过分界线而不 ...
- Tree 菜单 递归
转载:http://www.cnblogs.com/igoogleyou/archive/2012/12/17/treeview2.html 一,通过查询数据库的方法 ID 为主键,PID 表明数据之 ...