JPA中getOne()和findById有什么区别呢?

戚薇 Java经验 发布时间:2023-06-08 22:44:41 阅读数:12871 1
下文笔者讲述getOne()和findById()方法的区别说明,如下所示

getOne()和findById()方法简介说明

findById()和getOne()的功能:
    都是从数据库中检索某个对象
    
getOne():
   lazy操作(此方式可能没有访问数据库)
getOne():
   返回ID的引用对象
    他内部调用EntityManager.getReference()方法
    这个方法返回proxy而非直接访问数据库
	  当请求的实体不存在数据库中,那么此方法抛出EntityNotFoundException。

findById():
    此方法直接访问数据库返回真实的对象
      当这条记录在数据库中不存在,则返回null

getOne()和findById()方法区别

getOne() findById()
lazily loaded目标实体 直接通过ID获取数据库中的实体
只获取对象需要用的属性 快速加载对象的所有属性
如果对象不存在抛出EntityNotEoundException 对象不存在就返回null
更好的性能 传统数据库访问方式

getOne()和findById()方法示例

Department

@Entity
@Table(name = "t_departments")
public class Department {
 
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
 
    private String name;
Employee

@Entity
@Table(name = "t_employees")
public class Employee {
 
    @Id
    @GeneratedValue(strategy= GenerationType.AUTO)
    private Long id;
 
    private String name;
 
    @ManyToOne  
    private Department department;
Employee的department属性和Department类有关。

如下代码:

@Service
@Transactional(propagation = Propagation.REQUIRES_NEW)
public class HRService {
 
    @Autowired
    private DepartmentRepository departmentRepository;
 
    @Autowired
    private EmployeeRepository employeeRepository;
 
    public Department createDepartment() {
        Department dept = new Department();
        dept.setName("Product & Engg");
        return departmentRepository.save(dept);
    }
 
    public void createEmployee1(long deptId) {
        final Department pne = departmentRepository.getOne(deptId); 
        Employee employee = new Employee();
        employee.setName("Foo 1");
        employee.setDepartment(pne);
        employeeRepository.save(employee);
    }


使用getOne()比findById()要好,因为这里面的场景并不需要获取department的对象
//生成sql如下
insert into t_employees (department_id, name, id) values (?, ?, ?)


当使用findById()代替getOne()如下代码:

 public void createEmployee2(long deptId) {
        Optional<Department> pne = departmentRepository.findById(deptId);
        Employee employee = new Employee();
        employee.setName("Foo 1");
        pne.ifPresent(department -> {
            employee.setDepartment(department);
        });
        employeeRepository.save(employee);
 }


//生成sql信息
select department0_.id as id1_4_0_, department0_.name as name2_4_0_ from t_departments department0_ where department0_.id=? 
insert into t_employees (department_id, name, id) values (?, ?, ?)
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202306/16862355226756.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者