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


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.