java what 양방향 ManyToMany 저장




what is jpa (4)

응용 프로그램이 관계의 한 쪽을 업데이트 할 때 관계가 양방향이므로 다른 쪽도 업데이트되고 동기화되어야합니다. JPA에서는 일반적으로 Java와 마찬가지로 관계를 유지 관리하는 것이 애플리케이션 또는 객체 모델의 책임입니다. 응용 프로그램이 관계의 한쪽에 추가되면 다른쪽에 추가해야합니다.

이는 관계의 양면을 처리하는 객체 모델에서 메소드를 추가하거나 설정하여 해결할 수 있으므로 응용 프로그램 코드는 관계에 대해 신경 쓸 필요가 없습니다. 이 작업을 수행하는 방법은 두 가지가 있습니다. 관계 유지 코드를 관계의 한쪽에만 추가하고 한 쪽에서 설정자를 사용하거나 (다른 쪽을 보호하는 등) 양면에 추가 할 수 있습니다. 무한 루프를 피하십시오.

출처 : OneToMany#Getters_and_Setters

다음과 같은 방식으로 주석이 달린 두 개의 엔티티 클래스가 있습니다.

@Entity
class A {
   @ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
   private List<B> b;
 ..
}

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL)
   private List<A> a;
 ..
}

클래스 'B'의 인스턴스를 저장하면 관계가 데이터베이스에 저장되고 클래스 'A'의 getter는 B의 올바른 하위 집합을 반환합니다. 그러나 'A'의 Bs 목록을 변경하면 변경 사항이 데이터베이스에 저장되지 않습니다.

내 질문은 두 클래스의 변경 사항이 다른 클래스에 "계단식"이되도록 어떻게 만들 수 있습니까?

편집 : mappedBy 매개 변수를 제거하고 JoinTable (및 열)을 정의하는 다양한 변형을 시도했지만 올바른 조합을 찾을 수 없었습니다.


가장 짧은 대답은 당신이 할 수없는 것처럼 보입니다. 양방향 many-to-many 연관에서, 한쪽은 마스터가되어야하며, 기본 조인 테이블에 대한 변경 사항을 유지하는 데 사용됩니다. JPA는 제휴의 양면을 유지하지 않으므로 일단 데이터베이스에 저장하면 다시로드 할 수없는 메모리 상황이 발생할 수 있습니다. 예:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

이 상태를 유지할 수 있으면 join 테이블에 다음 항목이 표시됩니다.

a1_id, b_id
a2_id, b_id

그러나 로딩 할 때 JPA는 어떻게하면 b가 a2가 아닌 a2 만 알리려고한다는 것을 알 수 있습니까? b에 대해 알지 못하는 a2는 무엇입니까?

따라서 양방향 연결을 스스로 유지해야하며 (메모리에서도 위의 예를 얻을 수 없도록 설정해야합니다.) JPA는 한 쪽 상태에서만 지속됩니다.


어쩌면 A_M의 대답에 약간의 실수가있을 수 있습니다. 내 의견으로는 :

   @Entity
   class B { 
   @ManyToMany 
   @JoinTable (
       name="A_B",
       joinColumns = {@JoinColumn(name="B_ID")},
       inverseJoinColumns = {@JoinColumn(name="A_ID")}
   )
   private List a; 
   .. 
}

mappedBy 매개 변수를 클래스 B의 A 필드에 추가하려고 시도 했습니까?

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL, mappedBy = "b")
   private List<A> a;
 ..
}






jpa