phương thức nhận ()

Nếu bạn muốn lấy một đối tượng bằng ID của nó (hoặc Khóa chính), thì Hibernate có ba phương thức cho việc này:

  • trọng tải()
  • lấy()
  • tìm thấy()

Họ làm điều tương tự, nhưng có những sắc thái. Định dạng chung của phương thức get() là:

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

Phương thức get() lấy tham số thứ hai là ID (Khóa chính) của đối tượng mà nó cần trả về. Sau đó, nó tải đối tượng đó từ cơ sở dữ liệu và trả về nó. Ví dụ:

User user = session.get(User.class, 2);

Nếu không tìm thấy bản ghi có ID này trong cơ sở dữ liệu thì phương thức sẽ trả về giá trị rỗng.

phương thức tải ()

Phương thức thứ hai để tải một đối tượng là phương thức load() . Định dạng chung của phương thức load() giống nhau:

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

Tuy nhiên, hành vi của nó khác với phương thức get() .

Đầu tiên, phương thức này không trả về một đối tượng thực, mà là một proxy: một sơ khai ảo.

Thứ hai, khi sử dụng phương thức load() , không cần kiểm tra xem có mục nào như vậy trong cơ sở dữ liệu hay không. Thay vào đó, Hibernate ngay lập tức tạo một đối tượng proxy với ID đã truyền và trả về nó.

Thứ ba, tất cả các công việc với cơ sở dữ liệu sẽ xảy ra khi gọi các phương thức của đối tượng proxy. Ví dụ, nếu bạn cố gắng gọi phương thức getName() thì cuộc gọi đầu tiên tới cơ sở dữ liệu sẽ diễn ra. Ví dụ:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

Không nên sử dụng phương thức load() để kiểm tra sự hiện diện của các đối tượng trong cơ sở dữ liệu - đơn giản là nó sẽ không hiển thị điều này. Ngoài ra, nếu bạn chuyển một ID không hợp lệ, chẳng hạn như null, cho nó, nó sẽ chỉ trả về null.

phương thức tìm ()

Phương thức find() được chuyển sang giao diện Phiên từ tiêu chuẩn JPA. Và như bạn đã biết, tiêu chuẩn này không chỉ mô tả chữ ký của các phương thức mà còn điều chỉnh hành vi.

Phương thức này hoạt động chính xác như phương thức get() . Nếu đối tượng không được tìm thấy bởi khóa đã truyền, thì phương thức sẽ chỉ trả về null.

User user = session.find(User.class, -2); //method will return null

phương thức làm mới ()

Một phương thức hữu ích khác liên quan đến việc tải một đối tượng từ cơ sở dữ liệu là phương thức refresh() .

Bạn có nhớ phương thứcpersist() đã cập nhật dữ liệu trong cơ sở dữ liệu dựa trên đối tượng đã truyền không? Vì vậy, phương thức refresh() hoạt động hoàn toàn ngược lại: nó cập nhật một đối tượng hiện có dựa trên dữ liệu từ cơ sở dữ liệu.

Hành vi này là cần thiết nếu, ví dụ, khi ghi một đối tượng vào cơ sở dữ liệu, các thủ tục được lưu trữ khác nhau được gọi ở đó để sửa dữ liệu đã ghi.

Trong những trường hợp như vậy, có thể hữu ích khi đọc lại đối tượng từ cơ sở dữ liệu nếu có khả năng nó đã thay đổi. Ví dụ:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object