Các sắc thái của phương pháp hợp nhất()

Nếu bạn muốn sử dụng Hibernate để thay đổi một đối tượng đã được lưu trữ trong cơ sở dữ liệu, thì cũng có một số phương pháp cho việc này.

Đầu tiên là phương thức merge() , cập nhật thông tin trong cơ sở dữ liệu dựa trên đối tượng được truyền . Điều này sẽ gọi truy vấn CẬP NHẬT SQL. Ví dụ:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

User user2 = (User) session.merge(user);

Có một số sắc thái quan trọng ở đây.

Đầu tiên, phương thức merge() trả về kết quả, đối tượng được cập nhật. Đối tượng này có trạng thái Kiên trì và được gắn vào đối tượng phiên. Đối tượng được truyền cho phương thức merge() không thay đổi.

Có vẻ như không có sự khác biệt giữa người dùng và người dùng2, nhưng không phải vậy. Bạn có thể truyền một đối tượng POJO cho phương thức merge() và kết quả là phương thức này có thể trả về một proxy (tùy thuộc vào cài đặt Hibernate). Vì vậy, chỉ cần nhớ rằng phương thức hợp nhất () không thay đổi đối tượng đã truyền.

Thứ hai, nếu đối tượng được chuyển đến merge() có trạng thái Tạm thời (và nó không có ID), thì một dòng riêng sẽ được tạo cho nó trong cơ sở dữ liệu. Nói cách khác, lệnhpersist () sẽ được thực thi .

Thứ ba, nếu một đối tượng đã được gắn vào phiên (với trạng thái Persist) được truyền cho phương thức merge() , thì sẽ không có gì xảy ra - phương thức sẽ chỉ trả về cùng một đối tượng. Tại sao? Và tất cả bởi vì khi giao dịch được thực hiện, dữ liệu sẽ được ghi vào cơ sở dữ liệu:

User user = new User();
user.setName("Kolyan");
session.save(user);

user.setName("Masha"); //change the object attached to the session

session.close();  //all changed objects will be written to the database

Không cần phải lưu đối tượng mỗi lần sau bất kỳ thay đổi nào của nó. Nếu đối tượng này ở trạng thái Persist thì Hibernate sẽ tự làm mọi thứ. Nếu bạn thay đổi một đối tượng được “gắn vào cơ sở”, thì tất cả các thay đổi của nó sẽ được ghi vào cơ sở.

Các sắc thái của phương thức update()

Hibernate cũng có một phương thức update() , giống như phương thức save() , được kế thừa từ các phiên bản trước. Với phương pháp này, bạn chỉ có thể cập nhật dữ liệu của một đối tượng đã được lưu. Điều này sẽ gọi truy vấn CẬP NHẬT SQL. Ví dụ:

User user = new User();
user.setName("Kolyan");
session.save(user);

session.evict(user);     // detach the object from the session
user.setName("Masha");

session.update(user);

Phương thức này không trả về bất cứ thứ gì và không thay đổi đối tượng hiện có.

Nếu bạn gọi phương thức này trên một đối tượng mới, thì một ngoại lệ sẽ được ném ra:

User user = new User();
user.setName("Kolyan");
session.update(user);   //an exception will be thrown here

phương thức saveOrUpdate()

Trước khi JPA ra đời, chức năng của phương thứcpersist() được thực hiện bởi phương thức saveOrUpdate() . Nhiệm vụ của anh ta là cập nhật thông tin về đối tượng hiện có trong cơ sở dữ liệu và nếu không có thì hãy tạo nó. Nó hầu như luôn được sử dụng thay cho các phương thức save()update() .

Không giống như phương thức update() , nó có thể thay đổi đối tượng được truyền cho nó. Ví dụ: đặt nó thành ID đã được chỉ định khi lưu vào cơ sở dữ liệu. Ví dụ:

User user = new User();
user.setName("Kolyan");
session.saveOrUpdate(user);   //object will be written to the database

Làm thế nào nó hoạt động:

  • nếu đối tượng được truyền có ID, thì phương thức UPDATE SQL được gọi
  • nếu ID của đối tượng được truyền không được đặt, thì phương thức INSERT SQL được gọi