JPA中getOne()和findById有什么区别呢?
下文笔者讲述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 (?, ?, ?)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。