Sự khác nhau giữa load() và get() trong Hibernate
NỘI DUNG BÀI VIẾT
1. Method load()
- Chỉ sử dụng method load() khi bạn chắc chắn rằng đối tượng tồn tại trong database
- Method load() sẽ ném ra 1 exception nếu đối tượng không tìm thấy trong database
- Method load() chỉ trả về 1 đối tượng giả (proxy object) nó chỉ lấy dữ liệu từ database ra khi cần tới.
* Proxy Object là 1 đối tượng giả, nó chỉ có id, các thuộc tính khác không được khởi tạo, ví dụ khi bản để FETCH_TYPE = LAZY khi mapping thì nó cũng chỉ trả về 1 proxy object.
2. Method get()
- Nếu bạn không chắc chắn rằng đối tượng có tồn tại trong database không thì hãy dùng get()
- Method get() sẽ trả về null nếu không tìm thấy đối tượng trong database
- Method get() sẽ truy xuất vào database ngay lập tức để lấy đối tượng thực đang tồn tại.
Ví dụ 1:
Thực hiện get() đối tượng role có id = 1 và load() đối tượng user có id = 1000 (đối tượng này ko tồn tại trong database)
SessionFactory factory = HibernateUtils.getSessionFactory();
Session session = factory.openSession();
Users user = (Users) session.load(Users.class, 1000);
Role role = (Role) session.get(Role.class, 1);
Kết quả: chỉ có đối tượng role là được truy xuất từ database, còn đối tương user ko được truy xuất
Hibernate: select role0_.id as id1_6_0_, role0_.delete_flag as delete_f2_6_0_, role0_.name as name3_6_0_ from expense.role role0_ where role0_.id=?
Code language: JavaScript (javascript)
Ví dụ 2:
Thực hiện load() đối tượng user có id = 1000 và in ra email của user này (đối tượng này không tồn tại trong database)
SessionFactory factory = HibernateUtils.getSessionFactory();
Session session = factory.openSession();
Users user = (Users) session.load(Users.class, 1000);
System.out.println(user.getEmail());
Kết quả: Khi lấy email thì nó sẽ truy xuất tới database, nhưng vì đối tượng không tồn tại nên xảy ra exception org.hibernate.ObjectNotFoundException
Hibernate: select users0_.id as id1_10_0_, users0_.create_date as create_d2_10_0_, users0_.delete_flag as delete_f3_10_0_, users0_.email as email4_10_0_, users0_.enabled as enabled5_10_0_, users0_.name as name6_10_0_, users0_.password as password7_10_0_, users0_.update_date as update_d8_10_0_, users0_.version as version9_10_0_ from expense.users users0_ where users0_.id=?
Exception in thread "main" org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.mysql.entities.Users#1000]
at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:253)
at org.hibernate.proxy.AbstractLazyInitializer.checkTargetState(AbstractLazyInitializer.java:262)
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:176)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:286)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:185)
at com.mysql.entities.Users_$$_jvst75a_9.getEmail(Users_$$_jvst75a_9.java)
at com.mysql.dao.Demo.main(Demo.java:171)
Code language: PHP (php)
Ví dụ 3:
Thực hiện load() đối tượng user có id = 1 (Có tồn tại trong database) và in ra email của nó;
get() đối tượng role có id = 1000 (không tồn tại trong database) và in ra role name của nó:
SessionFactory factory = HibernateUtils.getSessionFactory();
Session session = factory.openSession();
Users user = (Users) session.load(Users.class, 1);
System.out.println(user.getEmail());
Role role = (Role) session.get(Role.class, 1000);
if (role == null) {
System.out.println("role with id = 1000 is null");
} else {
System.out.println(role.getName());
}
Code language: JavaScript (javascript)
Kết quả:
- Đối tượng user tồn tại nên nó sẽ truy xuất và in ra email
- Đối tượng role không tồn tại nên trả về null
Hibernate: select users0_.id as id1_10_0_, users0_.create_date as create_d2_10_0_, users0_.delete_flag as delete_f3_10_0_, users0_.email as email4_10_0_, users0_.enabled as enabled5_10_0_, users0_.name as name6_10_0_, users0_.password as password7_10_0_, users0_.update_date as update_d8_10_0_, users0_.version as version9_10_0_ from expense.users users0_ where users0_.id=?
0[email protected]
Hibernate: select role0_.id as id1_6_0_, role0_.delete_flag as delete_f2_6_0_, role0_.name as name3_6_0_ from expense.role role0_ where role0_.id=?
role with id = 1000 is null
Code language: JavaScript (javascript)
Tham khảo khóa học lập trình web 6 tháng, đảm bảo 100% công việc đầu ra!
Nguồn: https://stackjava.com/hibernate/su-khac-nhau-giua-load-va-get-trong-hibernate.html
Leave a Reply