Java文档阅读笔记-JPA中getOne()和findById的区别
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                Java文档阅读笔记-JPA中getOne()和findById的区别
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                findById()和getOne()都是從數據庫中檢索某個對象,不過獲取數據的方式是不同的,getOne()是lazy操作,這種操作甚至沒有訪問數據庫。
?
getOne()
返回ID的引用對象,他內部調用的了EntityManager.getReference()方法,這個方法返回proxy而非直接訪問數據庫(所以叫lazy),如果請求的實體不存在數據庫中,那么此方法拋出EntityNotFoundException。
?
findById()
此方法直接訪問數據庫返回真實的對象,如果這條記錄在數據庫中不存在,則返回null。
?
何時使用getOne()何時使用findById()
getOne()避免了數據庫和JVM的訪問,直到返回的proxy的屬性是真實的數據庫訪問。才會去訪問數據庫。
設計如下場景來說明這2個調用的區別:
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 {@Autowiredprivate DepartmentRepository departmentRepository;@Autowiredprivate 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 (?, ?, ?)總結:
| getOne() | findById() | 
| lazily loaded目標實體 | 直接通過ID獲取數據庫中的實體 | 
| 只獲取對象需要用的屬性 | 快速加載對象的所有屬性 | 
| 如果對象不存在拋出EntityNotEoundException | 對象不存在就返回null | 
| 更好的性能 | 傳統數據庫訪問方式 | 
總結
以上是生活随笔為你收集整理的Java文档阅读笔记-JPA中getOne()和findById的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: Linux笔记-bash批量启动、停止、
- 下一篇: Charles笔记-配置Charles代
