Các đối tượng tách rời, liên tục và tạm thời trong chế độ ngủ đông là gì? Hãy giải thích bằng một ví dụ.
Các đối tượng tách rời, liên tục và tạm thời trong chế độ ngủ đông là gì? Hãy giải thích bằng một ví dụ.
Câu trả lời:
Một new
phiên bản của lớp liên tục không được liên kết với a Session
, không có đại diện trong cơ sở dữ liệu và không có giá trị định danh nào được Hibernate coi là tạm thời :
Person person = new Person();
person.setName("Foobar");
// person is in a transient state
Một cá thể liên tục có một đại diện trong cơ sở dữ liệu, một giá trị định danh và được liên kết với a Session
. Bạn có thể làm cho một phiên bản tạm thời tồn tại lâu dài bằng cách liên kết nó với Session
:
Long id = (Long) session.save(person);
// person is now in a persistent state
Bây giờ, nếu chúng ta close
là Hibernate Session
, cá thể liên tục sẽ trở thành một cá thể tách rời : nó không được gắn vào một Session
nữa (nhưng vẫn có thể được sửa đổi và gắn lại vào một phiên bản mới Session
sau này).
Tất cả điều này được giải thích rõ ràng trong toàn bộ Chương 10. Làm việc với các đối tượng của tài liệu Hibernate mà tôi chỉ diễn giải ở trên. Chắc chắn, phải đọc.
A persistent instance has a representation in the database
Một thực thể liên tục không có đại diện trong cơ sở dữ liệu trước khi thực hiện thao tác lưu.
Đối tượng ở chế độ ngủ đông có các trạng thái sau:
Tạm thời - Các đối tượng được khởi tạo bằng toán tử mới được gọi là các đối tượng tạm thời.
Một đối tượng là tạm thời nếu nó vừa được khởi tạo bằng toán tử mới và nó không được liên kết với Phiên ngủ đông. Nó không có đại diện liên tục trong cơ sở dữ liệu và không có giá trị định danh nào được gán. Các phiên bản tạm thời sẽ bị hủy bởi bộ thu gom rác nếu ứng dụng không giữ một tham chiếu nữa.
Liên tục - Một đối tượng có danh tính cơ sở dữ liệu được liên kết với nó được gọi là đối tượng liên tục.
Một cá thể liên tục có một đại diện trong cơ sở dữ liệu và một giá trị định danh. Nó có thể đã được lưu hoặc tải; tuy nhiên, theo định nghĩa, nó nằm trong phạm vi của một Phiên. Hibernate sẽ phát hiện bất kỳ thay đổi nào được thực hiện đối với một đối tượng ở trạng thái liên tục và đồng bộ hóa trạng thái với cơ sở dữ liệu khi đơn vị công việc hoàn thành.
Tách rời - Một cá thể tách rời là một đối tượng vẫn tồn tại, nhưng Phiên của nó đã bị đóng.
Một phiên bản tách rời có thể được gắn lại vào một Phiên mới vào một thời điểm sau đó, làm cho nó hoạt động trở lại. Tính năng này cho phép mô hình lập trình cho các đơn vị công việc chạy dài đòi hỏi thời gian suy nghĩ của người dùng. Chúng tôi gọi chúng là các giao dịch ứng dụng, tức là một đơn vị công việc theo quan điểm của người dùng.
http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012
Hãy để tôi giải thích trong quan điểm của người thu gom rác.
Có 3 trạng thái Đối tượng của ngủ đông (hoặc) Đối tượng Phạm vi của ngủ đông-
Tốt hơn nên hiểu bằng một ví dụ mã-
Chúng ta hãy coi một lớp POJO là Đối tượng Sinh viên->
Student student = new Student();
Bây giờ, đối tượng sinh viên này đang ở trạng thái thoáng qua .
Khi chúng tôi đính kèm đối tượng POJO này vào phiên ngủ đông->
session.save(student);
Bây giờ đối tượng POJO này ở trạng thái liên tục .
(Quan điểm của bộ thu gom rác- GC không thể xóa sạch Bất kỳ đối tượng nào ở trạng thái liên tục. So với chúng ta, chúng ta có thể nói rằng trạng thái liên tục giống như lưu trữ tạm thời cho các đối tượng POJO )
Nếu chúng tôi thực hiện->
session.beginTransaction.commit();
thì đối tượng POJO ở trạng thái lưu trữ Thường trực hoặc Cơ sở dữ liệu
(Quan điểm của trình thu gom rác- GC không thể xóa đối tượng này vì đối tượng POJO này hiện nằm ngoài phạm vi của JVM và được lưu trữ trong bảng biểu mẫu bên trong cơ sở dữ liệu. Vì vậy, chúng ta có thể nói rằng trạng thái lưu trữ Cơ sở dữ liệu này giống như lưu trữ vĩnh viễn cho POJO vật thể )
Nếu chúng tôi thực hiện->
session.evict(student);
thì đối tượng POJO bị loại bỏ hoặc bị loại bỏ trở lại từ trạng thái liên tục sang trạng thái tách rời. Vì vậy trạng thái này của đối tượng POJO là trạng thái tách rời .
(Quan điểm của bộ thu gom rác- GC có thể dễ dàng xóa sạch đối tượng POJO ở trạng thái tách rời khỏi JVM)
Cho thực thể sau:
@Entity
public class City {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private long id;
// other fields and methods.
}
Từ tài liệu Hibernate 5.2 (tôi cũng đã bao gồm removed
trạng thái):
tạm thời
thực thể vừa được khởi tạo và không được liên kết với ngữ cảnh tồn tại. Nó không có đại diện liên tục trong cơ sở dữ liệu và thường không có giá trị định danh nào được chỉ định (trừ khi trình tạo được chỉ định được sử dụng).
City city = new City();
được quản lý hoặc liên tục
thực thể có một số nhận dạng được liên kết và được liên kết với ngữ cảnh tồn tại. Nó có thể tồn tại hoặc có thể chưa tồn tại thực tế trong cơ sở dữ liệu.
// city will be in a managed/persistent state and any changes to it, will be tracked by hibernate
// and reflected to the database when the persistence context is flushed.
session.save(city);
tách ra
thực thể có số nhận dạng được liên kết, nhưng không còn được liên kết với ngữ cảnh tồn tại (thường là do ngữ cảnh tồn tại đã bị đóng hoặc phiên bản đã bị loại bỏ khỏi ngữ cảnh)
// city is in a detached state, Hibernate is no longer aware of the entity
session.evict(city)
loại bỏ
thực thể có một số nhận dạng được liên kết và được liên kết với một ngữ cảnh tồn tại, tuy nhiên nó được lên lịch xóa khỏi cơ sở dữ liệu.
session.remove(city);
Lưu ý:
Hibernate API cung cấp các cặp phương thức để chuyển đổi giữa các trạng thái thực thể và tôi nghĩ bạn nên khám phá một lớp Hibernate Session .
Bên cạnh câu trả lời đúng đã được xác định dai dẳng, thoáng qua, tách rời chỉ là trạng thái của đối tượng ở trạng thái ngủ đông.
Nói chính xác hơn, ba trạng thái này thực sự hiển thị các thay đổi của đối tượng ngủ đông và trạng thái vòng đời của phiên