Sự khác nhau giữa load() và get() trong Hibernate

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

 

stackjava.com