Sự khác nhau giữa load() và get() trong Hibernate
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=?
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)
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()); }
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=? 0a@gmail.com 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