최대 절전 모드에서 분리 된 영구 및 일시적인 개체는 무엇입니까?


100

최대 절전 모드에서 분리 된 영구 및 일시적인 개체는 무엇입니까? 예를 들어 설명해주세요.


session.close시 세션 범위에서 지속성이었던 모든 개체를 제거하지 않습니까?
— Jigar Joshi

예, 세션을 닫을 때마다 개체의 영구 상태가 분리됨 상태로 변환되므로 제거됩니다.
— 레이첼

깊은 이해에 대한 코드와 함께 제공 @Rachel 좋은 링크
— Priyank Thakkar

답변:


161

new와 연관되지 않고 Session데이터베이스에 표현이 없으며 식별자 값이 Hibernate에 의해 일시적인 것으로 간주 되지 않는 영구 클래스 의 인스턴스 :

Person person = new Person();
person.setName("Foobar");
// person is in a transient state

영구 인스턴스 데이터베이스에 표현 된 식별자 값을 가지며와 연관된 Session. 임시 인스턴스 를 다음과 연결하여 영구적 으로 만들 수 있습니다 Session.

Long id = (Long) session.save(person);
// person is now in a persistent state

이제 우리 close가 Hibernate Session라면, 퍼시 스턴트 인스턴스는 분리 된 인스턴스가 될 것입니다 : 그것은 Session더 이상 연결되지 않습니다 (하지만 여전히 수정되고 Session나중에 새로운 인스턴스에 다시 연결될 수 있습니다 ).

이 모든 것은 10 장 전체에서 명확하게 설명되어 있습니다 . Hibernate 문서의 객체 에 대한 작업은 위에서 만 의역 할뿐입니다. 확실히, 반드시 읽어야합니다.


식별자 값은 할당 된 식별자 생성 전략을 사용할 수 있기 때문에 객체가 지속적으로 유지되는 엄격한 조건이 아닐 수 있습니다.
— Abhijeet Kashnia 2010

인스턴스에서 읽은 세션을 닫는 것 외에도 session.evict ()를 호출하여 인스턴스를 분리 할 수 ​​있습니다. 이것은 Hibernate에 의해 관리되는 것을 제거합니다 (따라서 인스턴스에 대한 변경 사항이 자동으로 db로 다시 전파되는 것을 방지합니다). session.update ()를 통해 db에 변경 사항을 보내고 session.merge ()로 다시 첨부 할 수 있습니다.
— Mooshu 2013

1
우리는 프레임 워크에서 제공하는 원본 문서를 따르지 않는 경우가 많습니다. 때때로 그 자체가 적절한 설명과 함께 숨겨진 정보를 가지고있는 경우도 있습니다. 문제는 쉽게 찾을 수 없다는 것입니다. :)
— agpt

A persistent instance has a representation in the database영구 엔티티는 저장 작업을 커밋하기 전에 데이터베이스에 표시되지 않습니다.
— O.Badr 2017

1
따라서 분리되고 일시적인 엔티티 차이는 ID의 존재 입니까? 할당 된 ID로 새 인스턴스를 만들면 아직 유지되지 않았기 때문에 공식적으로 일시적인 것이지만 ID가 있기 때문에 분리와 구별 할 수 없습니다. 권리?
— Ruslan Stelmachenko

9

최대 절전 모드의 개체에는 다음과 같은 상태가 있습니다.

과도-new 연산자를 사용하여 인스턴스화 된 객체를 과도 객체라고합니다.

객체는 new 연산자를 사용하여 방금 인스턴스화되고 Hibernate Session과 연관되지 않은 경우 일시적입니다. 데이터베이스에 영구적 인 표현이없고 식별자 값이 할당되지 않았습니다. 응용 프로그램이 더 이상 참조를 보유하지 않으면 임시 인스턴스는 가비지 수집기에 의해 파괴됩니다.

영구-연결된 데이터베이스 ID가있는 개체를 영구 개체라고합니다.

영구 인스턴스에는 데이터베이스와 식별자 값에 대한 표현이 있습니다. 저장되거나로드되었을 수 있습니다. 그러나 그것은 세션의 범위에 정의되어 있습니다. Hibernate는 지속적 상태의 객체에 대한 변경을 감지하고 작업 단위가 완료 될 때 상태를 데이터베이스와 동기화합니다.

분리됨-분리 된 인스턴스는 영구적이지만 세션이 닫혀있는 객체입니다.

분리 된 인스턴스는 나중에 새 세션에 다시 연결하여 다시 영구적으로 만들 수 있습니다. 이 기능은 사용자 생각 시간이 필요한 장기 실행 작업 단위를위한 프로그래밍 모델을 가능하게합니다. 이를 애플리케이션 트랜잭션, 즉 사용자의 관점에서 작업 단위라고합니다.

http://webiwip.com/interview-questions-answers/hibernate-interview-questions/32012


5

가비지 수집기의 관점에서도 설명하겠습니다.

최대 절전 모드 (또는) 개체 범위에는 3 가지 개체 상태가 있습니다.

  1. 과도 상태
  2. 지속적인 상태
  3. 분리 된 상태

코드 예제로 이해하는 것이 좋습니다.

POJO 클래스를 Student Object->로 간주하겠습니다.

Student student = new Student(); 

이제이 학생 객체는 일시적인 상태 입니다.


이 POJO 객체를 최대 절전 세션에 연결하면

session.save(student);

이제이 POJO 객체는 지속적 상태에 있습니다.

(Garbage Collector 관점-GC는 영구 상태에있는 객체를 삭제할 수 없습니다. 따라서 영구 상태는 POJO 객체의 임시 저장소 와 같다고 말할 수 있습니다. )


수행하면->

session.beginTransaction.commit();

POJO 객체는 영구 또는 데이터베이스 스토리지 상태입니다.

(Garbage Collector 관점-이 POJO 객체는 이제 JVM 범위 밖에 있고 데이터베이스 내부의 양식 테이블에 저장되기 때문에 GC는이 객체를 지울 수 없습니다. 그래서이 데이터베이스 저장소 상태는 POJO의 영구 저장소 와 같다고 말할 수 있습니다. 개체 )


수행하면->

session.evict(student); 

그런 다음 POJO 객체는 제거되거나 영구 상태에서 분리 된 상태로 다시 제거됩니다. 그래서 POJO 객체의이 상태는 분리 된 상태 입니다.

(Garbage Collector 관점-GC는 JVM에서 분리 된 상태의 POJO 객체를 쉽게 지울 수 있음)


2

다음 엔티티가 주어지면 :

@Entity
public class City {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private long id;

    // other fields and methods.
}

에서 최대 절전 모드 5.2 문서 (I도 포함 시켰 removed상태) :

과도 현상

엔티티가 방금 인스턴스화되었으며 지속성 컨텍스트와 연관되지 않았습니다. 데이터베이스에 영구적 인 표현이 없으며 일반적으로 식별자 값이 할당되지 않았습니다 (할당 된 생성기가 사용되지 않은 경우).

City city = new City();

관리 또는 영구

엔티티에는 연관된 식별자가 있으며 지속성 컨텍스트와 연관됩니다. 아직 데이터베이스에 물리적으로 존재하거나 존재하지 않을 수 있습니다.

// 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);

분리

엔티티에 연관된 식별자가 있지만 더 이상 지속성 컨텍스트와 연관되지 않습니다 (일반적으로 지속성 컨텍스트가 닫혔거나 인스턴스가 컨텍스트에서 제거 되었기 때문에)

// city is in a detached state, Hibernate is no longer aware of the entity 
session.evict(city)

제거됨

엔티티에는 연관된 식별자가 있고 지속성 컨텍스트와 연관되어 있지만 데이터베이스에서 제거되도록 예약되어 있습니다.

session.remove(city);


참고 : Hibernate API는 엔티티 상태를 전환하는 몇 가지 메소드를 제공하며 Hibernate Session 클래스를 탐색 할 가치가 있다고 생각합니다 .


0

이미 확인 된 정답 외에도 지속적이고 일시적이며 분리 된 것은 최대 절전 모드의 객체 상태 일뿐입니다.

더 정확하게 말하면,이 세 가지 상태는 실제로 최대 절전 모드 개체 변경 및 세션 수명주기 상태를 보여줍니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.