JPA学习笔记(9)——映射双向一对一关联关系
来源:互联网 发布:windows http server 编辑:程序博客网 时间:2024/06/06 02:28
双向一对一关联关系
一个部门有一个经理,一个经理管一个部门
Department实体类
package com.jpa.helloworld2;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="T_DEPARTMENT")@Entitypublic class Department { @Column(name="ID") @GeneratedValue @Id private Integer id; @Column(name="DEPT_NAME") private String deptName; @JoinColumn(name="MANAGER_ID") @OneToOne private Manager manager; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getDeptName() { return deptName; } public void setDeptName(String deptName) { this.deptName = deptName; } public Manager getManager() { return manager; } public void setManager(Manager manager) { this.manager = manager; }}
Manager实体类
package com.jpa.helloworld2;import javax.persistence.Column;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;import javax.persistence.OneToOne;import javax.persistence.Table;@Table(name="T_MANAGER")@Entitypublic class Manager { @Column(name="ID") @GeneratedValue @Id private Integer id; @Column(name="NAME") private String name; @OneToOne(mappedBy="manager") private Department department; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Department getDepartment() { return department; } public void setDepartment(Department department) { this.department = department; }}
关于mappedBy的使用,在前面的博客有讲到。
插入
Manager manager = new Manager();manager.setName("mgr1");Department department = new Department();department.setDeptName("deptName1");manager.setDepartment(department);department.setManager(manager);entityManager.persist(manager);entityManager.persist(department);
关于插入的顺序,先插入不维护关联关系的一方,即manager(没有外键的一方)
查询
查询维护关联关系的一方(有外键的一方)
Department dept = entityManager.find(Department.class, 1);System.out.println(dept.getDeptName());
发现执行了两次sql语句,既查询了department,也查询了manager
但我们此时只想要department,不想要manager。可以用fetch更改为懒加载策略:
在department实体类中
@OneToOne(fetch=FetchType.LAZY)private Manager manager;
查询不维护关联关系的一方(没有外键的一方)
Manager m = entityManager.find(Manager.class, 1);System.out.println(m.getName());
运行发现,查询manager时,一定会去查department,即使用fetch改为懒加载策略,结果也是一样的。
不同的时,如果改为懒加载,将会执行两个sql语句查询。默认情况下是执行一句sql语句关联查询。因此不推荐设置fetch
一定会查询两个对象的原因:
- 在查询manager表时,没有外键,jpa不知道该怎么处理Manager中的关联对象,因此它一定会去department表中查看有没有相应的记录。
- 在查询department时,因为有外键,所以jpa很容易的知道该怎么处理关联对象:要么返回一个代理,要么返回对象)
2 0
- JPA学习笔记(9)——映射双向一对一关联关系
- JPA学习笔记(10)——映射双向一对一关联关系
- JPA学习笔记(10)——映射双向一对一关联关系
- JPA学习笔记-映射双向一对一的关联关系
- JPA学习笔记(9)——映射双向一对多关联关系
- JPA学习笔记(9)——映射双向一对多关联关系
- JPA映射关联关系-双向一对一
- JPA学习笔记(8)——映射双向一对多关联关系
- JPA学习笔记(10)——映射双向多对多关联关系
- JPA学习笔记(11)——映射双向多对多关联关系
- JPA学习笔记(11)——映射双向多对多关联关系
- jpa双向一对一关联关系
- JPA学习笔记-映射双向一对多的关联关系
- Hibernate映射——一对一双向关联映射(六)
- 关联关系映射——一对一关联
- 关联关系映射——一对一关联
- JPA学习笔记(7)——映射多对一关联关系
- JPA学习笔记(8)——映射一对多关联关系
- 周赛
- POJ-3126 Prime Path
- 栈
- hdu 5339 暴力枚举
- linux之sed用法
- JPA学习笔记(9)——映射双向一对一关联关系
- 10.Palindrome Number
- Currency Exchange
- (二)操作系统结构之杂七杂八==??
- 嵌入式软件移植(4.5)------嵌入式软件程序设计
- 序列化和序列话反 入门案例
- C++泛型编程思想方法总结
- C语言中关于 赋值语句X=Y的解析
- ios打包应用程序,生成ipa文件