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

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



답변

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 문서의 객체 에 대한 작업은 위에서 만 의역 할뿐입니다. 확실히, 반드시 읽어야합니다.


답변

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

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

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

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

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

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

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

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


답변

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

최대 절전 모드 (또는) 개체 범위에는 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 객체를 쉽게 지울 수 있음)


답변

다음 엔티티가 주어지면 :

@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 클래스를 탐색 할 가치가 있다고 생각합니다 .


답변

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

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


답변