Tùy chọn trạng thái đối tượng có thể
Như bạn có thể nhận thấy, khi một đối tượng được gắn vào Hibernate, trạng thái của nó được gọi là Persistent hoặc Managed . Như thế nào mới đúng? Kiên trì hay Quản lý?
Nó có thể và như vậy, và như vậy. Theo đặc tả JPA, một đối tượng có trạng thái Kiên trì và theo đặc tả Hibernate, trạng thái của nó được gọi là Quản lý.
Trong Hibernate, công việc với cơ sở dữ liệu được thực hiện thông qua một đối tượng thuộc loại org.hibernate.Session . Theo JPA, lớp nên được gọi là javax.persistence.EntityManager. Đây thực sự không phải là một vấn đề lớn, vì cả hai loại đều là giao diện.
Giao diện org.hibernate.Session được khai báo như sau:
interface Session extends java.lang.AutoCloseable, javax.persistence.EntityManager, HibernateEntityManager, QueryProducer, java.io.Serializable, SharedSessionContract {
}
Do đó, giao diện Phiên có tất cả các phương thức có trong giao diện EntityManager . Nhưng nó cũng có cái riêng, cái mà nó kế thừa từ các phiên bản Hibernate trước đó, khi chưa có đặc tả JPA.
Toàn bộ tình huống này được mô tả như sau:
![](https://cdn.codegym.cc/images/article/c4cc3931-5115-471e-aec1-812c863f7c4a/1024.jpeg)
Chúng ta hãy xem xét tất cả các phương thức mà giao diện phiên có, cũng như các sắc thái công việc của chúng.
Các sắc thái của phương thứcpersist()
Khi lưu một đối tượng vào cơ sở dữ liệu, bạn cần nhớ hai điều.
Đầu tiên, việc lưu đối tượng cuối cùng sẽ dẫn đến việc thực thi một trong các lệnh SQL: INSERT hoặc UPDATE. Thứ hai, những hành động này sẽ không xảy ra ngay sau khi gọi phương thức của đối tượng.phiên họp, nhưng chỉ sau khi đóng giao dịch.
Hãy xem xét một số tình huống đơn giản, ví dụ, bạn có một lớp Người dùng :
@Entity
public class User {
@Id
@GeneratedValue
public Integer id;
@Columnt(name=”user_name”)
public String name;
}
Hãy lưu đối tượng của nó vào cơ sở dữ liệu bằng cách sử dụng phương thứcpersist() .
User user = new User();
user.setName("Kolyan");
session.persist(user);
Mục đích của phương thức này là lưu một đối tượng mới vào cơ sở dữ liệu. Nếu chưa có đối tượng nào như vậy, thì nó sẽ được thêm vào cơ sở dữ liệu bằng cách gọi phương thức INSERT SQL .
Nếu đối tượng đã có trong cơ sở dữ liệu thì sẽ không có gì xảy ra. Tuy nhiên, cũng có thể xảy ra trường hợp thứ ba - nỗ lực lưu một đối tượng có trạng thái Đã tách vào cơ sở dữ liệu. Trong trường hợp này, một ngoại lệ sẽ được ném ra. Ví dụ:
User user = new User();
user.setName("Kolyan");
session.persist(user);
session.evict(user); // detach the object from the session
session.persist(user); // a PersistenceException will be thrown here!
Các sắc thái của phương thức save()
Phương thức save() được Hibernate hiện tại kế thừa từ các phiên bản trước của nó. Về cốt lõi, nó rất giống với phương thứcpersist() , nó cũng thêm một bản ghi mới vào bảng bằng cách sử dụng phương thức INSERT. Tuy nhiên, nó có một số sắc thái thú vị.
Đầu tiên, phương thức này trả về một giá trị - ID mới của đối tượng . Như bạn đã biết, các đối tượng thường không có ID trước khi được thêm vào cơ sở dữ liệu và nó đã được gán bởi cơ sở dữ liệu. Vì vậy, phương thức save() của đối tượng phiên trả về ID đã được gán cho đối tượng đã lưu.
Quan trọng! Theo đặc tả ID Hibernate, nó có thể là bất kỳ đối tượng có thể tuần tự hóa nào, không chỉ là một số. Nó có thể là một chuỗi, một số, một enum, bất cứ thứ gì nói chung có thể được đặt hoàn toàn trong một cột của bảng trong cơ sở dữ liệu.
Phương thức save() có loại kết quả Nối tiếp, vì vậy kết quả của nó phải được chuyển thành đúng loại:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
Ngoài ra, phương thức save() có một hành vi khác trong trường hợp trạng thái Tách rời của đối tượng. Nó coi một đối tượng như vậy là mới và chỉ cần thêm một mục khác:
User user = new User();
user.setName("Kolyan");
Integer id = (Integer) session.save(user);
session.evict(user); // detach the object from the session
Integer id2 = (Integer) session.save(user);
Các biến id và id2 sẽ khác nhau. Hai bản ghi sẽ được thêm vào bảng trong cơ sở dữ liệu, một bản ghi cho mỗi thao tác save() .