Các đối tượng tách rời, liên tục và tạm thời trong chế độ ngủ đông là gì?


100

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ụ.


khi session.close sẽ không xóa tất cả các đối tượng vẫn tồn tại trong phạm vi phiên?
Jigar Joshi

Có nó sẽ loại bỏ vì vậy bất cứ khi nào bạn đóng một phiên trạng thái liên tục của một đối tượng được chuyển đổi thành trạng thái tách rời.
Rachel

@Rachel liên kết tốt đẹp cung cấp mã cho sự hiểu biết sâu sắc hơn
Priyank Thakkar

Câu trả lời:


161

Một newphiê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 closelà 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 Sessionnữ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 Sessionsau 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.


Giá trị số nhận dạng có lẽ không phải là điều kiện nghiêm ngặt để một đối tượng tồn tại lâu dài vì tôi có thể sử dụng chiến lược tạo mã định danh được chỉ định.
Abhijeet Kashnia

Bên cạnh việc đóng phiên đã đọc trong phiên bản, người ta có thể tách một phiên bản bằng cách gọi session.evict (). Điều này sẽ loại bỏ nó khỏi bị quản lý bởi Hibernate (do đó ngăn các thay đổi đối với thể hiện được tự động truyền ngược trở lại db). Bạn có thể gửi các thay đổi cho db qua session.update () và đính kèm lại nó với session.merge ().
Mooshu

1
Nhiều lúc chúng ta không làm theo các tài liệu gốc được cung cấp bởi các khuôn khổ .. mà bản thân nó đôi khi có thông tin ẩn với mô tả phù hợp chỉ cần bạn khám phá. chỉ có điều là chúng tôi không dễ dàng tìm thấy nó :)
agpt

A persistent instance has a representation in the databaseMộ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.
O.Badr

1
Vì vậy, sự khác biệt thực thể tách rời và tạm thời là sự hiện diện của ID ? Nếu tôi tạo phiên bản mới với id được chỉ định, thì về mặt hình thức, nó là tạm thời, vì nó chưa được tồn tại, nhưng không thể phân biệt được với đã tách ra, vì nó có một ID. Đúng?
Ruslan Stelmachenko

9

Đố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


5

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-

  1. Chính phủ tạm thời
  2. trạng thái dai dẳng
  3. trạng thái tách rời

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)


2

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 removedtrạ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 .


0

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.