JPA学习笔记(9)——映射双向一对一关联关系

双向一对一关联关系

一个部门有一个经理,一个经理管一个部门

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")
@Entity
public 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")
@Entity
public 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很容易的知道该怎么处理关联对象:要么返回一个代理,要么返回对象)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-31 18:02:22

JPA学习笔记(9)——映射双向一对一关联关系的相关文章

JPA学习笔记(8)——映射一对多关联关系

一对多关联关系 本文有很多和多对一是一样的,因此不会写得非常具体. 有看不懂的.能够參考JPA学习笔记(7)--映射多对一关联关系 Order实体类 package com.jpa.helloworld2; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; imp

hibernate映射-双向n-n关联关系

(学习记录,错误不足之处,请您耐心指正^_^) hibernate映射-双向n-n关联关系 一.代码示例: {类文件↓} Category.class package com.zit.hibernate.n2n.both; import java.util.HashSet; import java.util.Set; public class Category { private Integer id; private String name; private Set<Item> items

JPA学习笔记(5)——EntityManager相关

Persistence EntityManagerFactory EntityManager find方法 getReference方法 persist方法 remove方法 merge方法 情况1传入的对象没有id 情况2传入的对象有identityManager的缓存中没有该对象数据库中没有该记录 情况3传入的对象有identityManager的缓存没有该对象数据库中有该记录 情况4传入的对象有identityManager的缓存有该对象 flush方法 refresh方法 clear c

JPA学习笔记(7)——映射多对一关联关系

多对一关联关系 两个实体类,User和Order,一个User可以有多个Order,一个Order只能有一个User 建立关联关系 使用@ManyToOne注解映射多对一关联关系 User实体类 package com.jpa.helloworld; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.pers

[原创]java WEB学习笔记82:Hibernate学习之路---映射 一对多关联关系,配置,CRUD方法测试及注意点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

jpa的双向一对多和双向一对一关联关系

在分享之前先给大家看两个异常,应该说这一类的异常还是很常见的,主要原因是jar包冲突 异常1: java.lang.NoSuchFieldError: INSTANCE at org.hibernate.type.BasicTypeRegistry.<init>(BasicTypeRegistry.java:94) at org.hibernate.type.TypeResolver.<init>(TypeResolver.java:59) at org.hibernate.cfg

jpa双向一对一关联关系

1.1.  关系维护方 Person.java package com.morris.entity; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persi

Spring入门---JPA学习笔记

用了一段时间的Spring,到现在也只是处于会用的状态,对于深入一点的东西都不太了解.所以决定开始深入学习Spring. 本文主要记录JPA学习.在学习JPA之前,需要了解一些ORM的概念. ORM概念: 对象关系映射ORM(Object/Relation Mapping)是一种为了解决面向对象和关系数据之间存在互不匹配现象的技术(范式不匹配).简而言之,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到数据库中.本质上是将数据从一种形式转换到另外一种形式.(个人考虑:

JPA学习笔记1——JPA基础 (转自CSDN)

http://blog.csdn.net/chjttony/article/details/6086298 1.JPA简介: Java持久化规范,是从EJB2.x以前的实体Bean(Entity bean)分离出来的,EJB3以后不再有实体bean,而是将实体bean放到JPA中实现.JPA是sun提出的一个对象持久化规范,各JavaEE应用服务器自主选择具体实现,JPA的设计者是Hibernate框架的作者,因此Hibernate作为Jboss服务器中JPA的默认实现,Oracle的Weblo