programing

JPA 최대 절전 모드 - 데이터베이스와 주석 모두에서 캐스케이드 삭제

cafebook 2023. 9. 20. 20:44
반응형

JPA 최대 절전 모드 - 데이터베이스와 주석 모두에서 캐스케이드 삭제

짧은.

SO 질문을 비롯해 이를 이해하려는 글을 많이 읽었는데 어떻게 해야 할지 고민입니다.내가 읽은 것 중에 이것으로 정곡을 찌른 것은 없습니다.

애플리케이션뿐만 아니라 캐스케이드 규칙을 사용하여 데이터베이스를 정의할 경우 다음과 같은 방법을 취해야 하는지 여부가 결정되기 때문에 어떻게 되는지 알고 싶습니다.

예시표

create table foo(
  id int unsigned not null auto_increment,
  primary key(id)
);

create table bar(
  id int unsigned not null auto_increment,
  foo_id int unsigned not null,
  primary key(id),
  foreign key(foo_id) references foo(id) on delete cascade on update cascade
)

예제클래스

@Entity
@Table(name = "foo")
public class Foo {

  private int id;
  private List<Bar> bars;

  @Id
  @GeneratedValue
  @Column(name = "id")
  public int getId() {
    return id;
  }

  @OneToMany(mappedBy = "foo", cascade = {CascadeType.ALL})
  public List<Bar> getBars() {
    return bars;
  }

  public void setId() {
    this.id = id;
  }

  public void setBars(List<Bar> bars) {
    this.bars = bars;
  }

}

@Entity
@Table(name = "bar")
public class Bar {

  private int id;
  private Foo foo;

  @Id
  @GeneratedValue
  @Column(name = "id")
  public int getId() {
    return id;
  }

  @ManyToOne
  @JoinColumn(name = "foo_id", nullable = false)
  public getFoo() {
    return foo;
  }

  public void setId(int id) {
    this.id = id;
  }

  public void setFoo(Foo foo) {
    this.foo = foo;
  }

}

문의사항

지금 삭제 작업을 호출하는 경우(완료)EntityManagerFactory아니면SessionFactory)에Fooobject, 다음 중 어떤 것이 발생합니까?

  1. 최대 절전 모드 작업을 수행하면 에 있는 모든 레코드가 삭제됩니다.bar외국 열쇠가 그것인 테이블Foofoo_id그런 다음 삭제합니다.Foo기록.

  2. 최대 절전 모드 작업을 수행하면 해당하는 모든 작업이 삭제됩니다.Bar세션 캐시에 로드된 레코드(모두일 수도 있고 아닐 수도 있음)bar실제 데이터베이스에 존재하는 레코드)를 삭제합니다.Foorecord(데이터베이스 캐스케이드 규칙은 나머지를 삭제합니다)bar기록).

  3. 최대 절전 모드 작업에서 삭제를 시도합니다.Foo먼저 기록하고 데이터베이스 장애가 발생한 경우 앞서 설명한 단계 중 하나를 수행합니다.

  4. 제가 생각하지 못했던 다른 일이 발생한다면 어떻게 하죠?

다음과 같은 딜레마 가정을 고려할 때, 가장 좋은 접근법은 무엇입니까?

딜렘나

1이 참이면 다음을 제시할 수 있습니다.

A) 데이터베이스에만 캐스케이드 규칙을 정의합니다.반드시 제거합니다.bars데이터베이스가 레코드를 삭제하기 때문에 데이터베이스에서 분리되지 않도록 응용프로그램의 개체에서 삭제할 호출을 수행합니다.foo.

오어

B) 애플리케이션에서 캐스케이드 규칙을 정의하는 것은 데이터베이스 무결성을 철저하게 관리하기 때문입니다.

것은 아니다.

C) 원하는 결과를 각각 달성하여 다른 쪽을 처리하는 데 낭비가 되므로 두 가지 모두에서 캐스케이드 규칙을 정의합니다.

2가 참이면 다음을 제시할 수 있습니다.

데이터베이스와 애플리케이션 모두에서 캐스케이드 규칙을 정의하여 하이버네이트가 엔티티 관리를 담당하고 애플리케이션이 모든 개체를 제거하는 것이 보장되지 않으므로 데이터베이스가 정리할 수 있습니다.bar기록.

3이 참이면 다음을 제시할 수 있습니다.

Hibernate가 데이터베이스 수준에서 이미 정의된 캐스케이드 규칙을 지원하는 것처럼 보이기 때문에 데이터베이스와 애플리케이션 모두에서 캐스케이드 규칙을 정의합니다.

만약 4가 참이라면 다음을 제시할 것입니다.

이 질문은 제가 근본적인 것을 놓쳤기 때문에 더욱 중요합니다!

편집: 읽은 기사 추가...

관련기사

데이터베이스, 응용프로그램 또는 둘 다에 대해 상반된 보기:

SO - should-i-let-jpa-또는 데이터베이스-cascade-삭제

데이터베이스 또는 응용프로그램에 대해 충돌하는 보기:

SO - cascading-delete-updates-using-jpa-or-inside-of-Database

이 기사에서는 JPA 공급자가 실제로 하는 일을 설명합니다(OpenJ를 사용한다는 점에 유의해야 함).운영 증명을 위한 PA 제공업체):

jpa-

다음 사항을 명시하고 있습니다.

제거 및 지속 작업의 계단식 작업은 아직 로드되지 않은 엔티티에도 적용됩니다.심지어 다른 개체로 전달하여 전체 개체 그래프를 통과할 수도 있습니다.

다음과 같이 진술합니다.

새로 고침, 병합 및 분리의 캐스케이딩은 이미 로드된 엔티티만 통과합니다.

이는 제안된 프로세스 2가 사실이 아님을 의미합니다.

데이터베이스에 캐스케이드를 선언하고 최대 절전 모드로 전환하면 데이터베이스가 지원하는 경우 항상 먼저 삭제되며 최대 절전 모드 호출은 실제로 실행되는 것 외에는 아무 것도 삭제되지 않습니다.그러나 최대 절전 모드를 사용하기 때문에 데이터베이스 측면 캐스케이드 기능을 지원하지 않을 수 있는 새 데이터베이스로 쉽게 전환할 수 있는 것이 주된 장점입니다.따라서 데이터베이스가 캐스케이드를 지원하고 최대 절전 모드 밑줄 친 jdbc 문이 현재 아무것도 수행하지 않는 경우에도 해당 문을 그대로 두길 원할 것입니다(향후에 수행할 수 있음).

왜 그걸 고려하는 겁니까?동면 캐스케이드 옵션을 고수하는 것이 가장 좋습니다.반대쪽에서 캐스케이드를 양쪽에 배치하면 캐스케이드 삭제가 두 번 실행됩니다.한 번은 최대 절전 모드에서, 한 번은 데이터베이스에서 관리합니다.

예 189. 최대 절전 모드 5.2 문서.sql 이하를 생성합니다.

@Entity(name = "Person")
public static class Person {
    @ManyToMany(cascade = {CascadeType.DELETE})
    private List<Address> addresses = new ArrayList<>();
    ...
}

Person person1 = entityManager.find( Person.class, personId );
entityManager.remove( person1 );
DELETE FROM Person_Address
WHERE  Person_id = 1

DELETE FROM Person
WHERE  id = 1

이제 최대 절전 모드가 상위 항목을 삭제하기 전에 하위 항목을 삭제합니다.데이터베이스 캐스케이드는 sql person delete에서 실행되지만 이전에 자식이 제거되었을 때는 지금 제거할 것이 없습니다.

언급URL : https://stackoverflow.com/questions/22286649/jpa-hibernate-cascade-delete-in-both-database-and-annotation

반응형