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 (?, ?, ?)
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


