상태 목록

이제 재미가 시작됩니다. Entity 개체의 상태를 연구합니다. 모든 것과 Hibernate 사용에 대해서도 비용을 지불해야 합니다. HQL을 배우는 것이 이만한 대가라고 생각하지 않습니까? 아니, 삶은 조금 더 복잡하다.

Hibernate를 사용하여 데이터베이스에 저장할 수 있는 일종의 Entity 개체가 있는 경우 Hibernate의 관점에서 이 개체는 다음 네 가지 상태를 가질 수 있습니다.

  • 과도 현상
  • 영구 (또는 관리)
  • 떨어져 있는
  • 제거됨

그리고 여러분의 관심을 끌기 위해 이 강의에 이 사진을 추가하겠습니다.

과도 현상

사실, 뉘앙스가 없는 것은 아니지만 모든 것이 보이는 것보다 훨씬 간단합니다. 예를 들어, Java 코드를 사용하여 명시적으로 생성하고 Hibernate를 사용하여 데이터베이스에서 로드하지 않은 모든 Entity 객체는 임시(투명) 상태를 갖습니다.

EmployeeEntity employee = new EmployeeEntity();

Transient 상태는 Hibernate가 이 객체에 대해 전혀 모르고 객체에 대한 조치가 Hibernate에 영향을 미치지 않으며 이 객체에 대한 Hibernate의 작업도 없음을 의미합니다.

이러한 객체를 POJO - Plain Old Java Object 라고도 합니다 . 이 용어는 종종 까다로운 동작을 하는 다양한 개체의 반대말로 사용됩니다. Mockito가 만든 Moc 객체를 기억하십니까? 여기서 그들은 POJO가 아닙니다.

일부 클라이언트 코드가 Transient 상태의 개체와 작동하는 경우 상호 작용은 매우 간단한 체계로 설명할 수 있습니다.

영구 또는 관리

다음으로 가장 일반적인 경우는 Hibernate 엔진과 관련된 개체입니다. 해당 상태를 영구(또는 관리됨)라고 합니다. 이 상태의 개체를 가져오는 방법에는 정확히 두 가지가 있습니다.

  • 최대 절전 모드에서 개체를 로드합니다.
  • 최대 절전 모드에서 객체를 저장하십시오.

예:

Employee employee = session.load(Employee.class, 1);
Employee employee = new Employee ();
session.save(employee);

이러한 개체는 일반적으로 데이터베이스의 일종의 레코드에 해당하며 ID 등이 있습니다. 이 개체는 Hibernate 세션에 연결되며 일반적으로 실제 개체가 아닌 일종의 프록시로 나타낼 수 있습니다.

session.load() 메서드를 호출한 후 일부 스텁 개체(프록시)를 반환하고 데이터베이스에 대한 모든 호출은 이 개체의 메서드를 호출한 후에만 수행될 가능성이 매우 높습니다 . 그러나 나중에 그러한 세부 사항에 대해 이야기하겠습니다.

클라이언트 코드와 관리됨 상태의 개체 간의 상호 작용은 다음 그림으로 설명할 수 있습니다.

떨어져 있는

다음 상태는 객체가 세션에서 분리되었을 때입니다. 즉, 일단 객체가 Hibernate 세션에 연결되었지만 세션이 닫히거나 트랜잭션이 종료되면 Hibernate는 더 이상 이 객체를 모니터링하지 않습니다.

예:

session.close();
session.evict(entity);

첫 번째 예에서는 세션이 닫혔습니다. 두 번째 경우에는 evict() 메서드 를 사용하여 세션에서 개체를 분리할 것임을 명시적으로 표시했습니다 .

새로운 코드 개체 상호 작용 체계는 다음과 같습니다.

그리고 여기가 흥미로워지는 곳입니다. 당신의 객체가 Hibernate로부터 얻어졌다면, 실제 객체 대신에 프록시가 주어졌을 가능성이 있습니다. 그리고 이 프록시 개체는 세션에서 연결을 끊은 후 메서드가 호출될 때 예외를 throw합니다.

이것은 Hibernate로 작업할 때 모든 초보자에게 가장 일반적인 문제입니다. Entity 개체로 작업할 때 주어진 시간에 다음과 같은 질문에 대한 답을 정확히 알아야 합니다 .

  • 실제 개체가 있습니까, 아니면 실제 개체의 프록시만 있습니까?
  • 현재 거래 중입니까?
  • 읽기-쓰기 트랜잭션입니까 아니면 읽기 전용 트랜잭션입니까?
  • 개체가 LazyLoading 메커니즘에 의해 관리됩니까?
  • 개체의 어떤 부분이 이미 메모리에 로드되었으며 액세스할 때 어떤 부분이 로드됩니까?
  • 개체가 종속 개체에 어떻게 연결되어 있습니까?

좋은 소식은 대부분의 경우 명백하다는 것입니다. 하지만 내부적으로 어떻게 작동하는지 이해해야 합니다. 선언적 프로그래밍은 10분 안에 코드를 작성할 수 있고, 10시간 안에 코드가 제대로 작동하지 않는 이유를 이해할 수 있습니다 :)

제거됨

Entity 개체가 가질 수 있는 마지막 상태는 제거됨입니다. 이름에서 이미 짐작하셨겠지만 이것은 원격 개체의 상태입니다.

이 상태는 데이터베이스에서 일부 개체를 삭제해도 Java 개체가 즉시 사라지지 않기 때문에 나타납니다.

Employee employee = session.load(Employee.class, 1);
//after loading the object's state is Persisted

session.remove(employee);
//after deletion, the state of the object is Removed

session.save(employee);
//and now Persisted again

session.close();
//and now the Detached state