日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java文档阅读笔记-JPA中getOne()和findById的区别

發布時間:2025/3/15 java 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。