계단식 변경

사용 가능

6.1 깊은 종속성 관리

그리고 @OneToMany 주석 등에 대한 좀 더 유용하고 흥미로운 것들이 있습니다 . 모두 일반적으로 사용되는 4가지 옵션이 있습니다.

  • 캐스케이드 = CascadeType.ALL
  • 고아 제거 = true
  • 가져오기 = FetchType.LAZY

이제 더 자세히 분석하겠습니다. 그리고 가장 흥미로운 CascadeType 부터 시작하겠습니다 . 이 매개변수는 기본 엔터티를 변경하는 경우 종속 엔터티에 어떤 일이 발생해야 하는지 결정합니다.

JPA 사양에는 이 매개변수에 대해 다음 값이 있습니다.

  • 모두
  • 지속
  • 병합
  • 제거하다
  • 새로 고치다
  • 분리하다

그러나 Hibernate는 이 사양을 세 가지 추가 옵션으로 확장합니다.

  • 뒤로 젖히다
  • 저장_업데이트
  • 잠그다

물론 데이터베이스와 그들의 CONSTRANIS와 강력한 유사점이 있습니다. 그러나 차이점도 있습니다. Hibernate는 가능한 한 데이터베이스와의 실제 작업을 숨기려고 시도하므로 이러한 Hibernate Cascades는 정확히 Entity 개체에 관한 것입니다.

6.2 캐스케이드 유형

cascade 매개 변수는 부모(마스터 개체)를 변경하는 경우 종속 개체에 어떤 일이 발생해야 하는지 설명합니다. 대부분의 경우 이 매개변수는 개체 종속성을 설명하는 주석과 함께 사용됩니다.

예:

OneToOne(cascade = CascadeType.ALL)

또는 다음과 같이:

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})

별도의 주석으로 작성할 수도 있습니다.

@Cascade({ org.hibernate.annotations.CascadeType.ALL })

이제 이러한 주석이 무엇을 의미하는지 자세히 알아보겠습니다.

6.3 모두, 유지, 병합

CascadeType.ALL상위 개체로 수행하는 모든 작업이 종속 개체에 대해 반복되어야 함을 의미합니다 .

CascadeType.PERSIST즉, 상위 개체를 데이터베이스에 저장하면 종속 개체에 대해서도 동일한 작업을 수행해야 합니다. 예:

@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToOne(cascade = CascadeType.PERSIST, mappedBy="task")
   private EmployeeTask task;
}

이 클래스로 작업하는 예:

Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;

session.persist(director);
session.flush();

Employee 유형의 개체만 저장하고 종속 개체 EmployeeTask는 자동으로 데이터베이스에 저장됩니다.

CascadeType.MERGE즉, 데이터베이스에서 상위 개체를 업데이트하면 종속 개체도 동일하게 수행해야 합니다.

6.4 제거, 삭제, 분리

CascadeType.REMOVE즉, 데이터베이스에서 상위 개체를 삭제하면 종속 개체도 동일하게 수행해야 합니다.

CascadeType.DELETE같은 것을 의미합니다. 이들은 동의어입니다. 다른 사양에서.

CascadeType.DETACH즉, 세션에서 상위 개체를 제거하면 종속 개체에 대해서도 동일한 작업을 수행해야 합니다. 예:

@Entity
@Table(name="employee")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToOne(cascade = CascadeType.DETACH, mappedBy="task")
   private EmployeeTask task;
}

이 클래스로 작업하는 예:


Employee director = new Employee();
EmployeeTask task = new EmployeeTask();
director.task = task;
director.task = task;
session.flush();
 
assertThat(session.contains(director)).isTrue();
assertThat(session.contains(task)).isTrue();
 
session.detach(director);
 
assertThat(session.contains(director)).isFalse();
assertThat(session.contains(task)).isFalse();

CascadeType.REFRESHCascadeType.SAVE_UPDATE우리가 기대하는 것과 같은 방식으로 작동합니다. 상위 개체와 함께 수행되는 작업을 종속 개체에 복제합니다 .

6.5 고아 제거 옵션

또한 때로는 매개변수를 접하게 될 수도 있습니다 orphan. 고아 제거의 줄임말입니다. 부모 엔터티 없이 자식 엔터티가 없는지 확인하는 데 사용됩니다.

OneToOne(orphan = true)

이 매개변수를 true로 설정하면 하위 엔티티가 사라진 경우 삭제됩니다.모든 링크. 와 정확히 같지는 않습니다 Cascade.REMOVE.

여러 상위 엔티티가 하나의 하위 항목을 참조하는 상황이 있을 수 있습니다. 그런 다음 상위 엔티티 삭제와 함께 삭제되지 않고 이에 대한 모든 참조가 무효화된 경우에만 삭제되는 것이 좋습니다.

클래스가 있다고 가정해 보겠습니다.

@Entity
@Table(name="user")
class Employee {
   @Column(name="id")
   public Integer id;

   @OneToMany(cascade = CascadeType.ALL, orphan = true)
   @JoinColumn(name = "employee_id")
   private Set<EmployeeTask> tasks = new HashSet<EmployeeTask>();
}

Employee director = session.find(Employee.class, 4);
EmployeeTask task = director.tasks.get(0);
director.tasks.remove(task)
session.persist(director);
session.flush();

EmployeeTask 개체는 참조가 남아 있지 않기 때문에 삭제됩니다. 동시에 아무도 부모 개체를 삭제하지 않았습니다.

6.6 가져오기 옵션

가져오기 옵션을 사용하면 종속 개체가 로드되는 방식을 제어할 수 있습니다. 일반적으로 다음 두 값 중 하나를 사용합니다.

  • FetchType.LAZY
  • FetchType.EAGER

이것은 다양한 함정이 있는 매우 흥미로운 주제이므로 별도의 강의에서 이야기하는 것이 좋습니다.

코멘트
  • 인기
  • 신규
  • 이전
코멘트를 남기려면 로그인 해야 합니다
이 페이지에는 아직 코멘트가 없습니다