문제

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

@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-Parameter를 제거하고 관절 (및 열)을 정의하는 다양한 변형을 시도했지만 올바른 조합을 찾을 수 없었습니다.

도움이 되었습니까?

해결책

가장 짧은 대답은 당신이 할 수없는 것 같습니다. 양방향 다수의 협회에서 한쪽은 마스터이어야하며 기본 조인 테이블의 변경을 지속하는 데 사용됩니다. JPA는 협회의 양쪽을 유지하지 않기 때문에 데이터베이스에 저장되면 다시로드 할 수없는 메모리 상황으로 끝날 수 있습니다. 예시:

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

이 상태가 지속될 수 있다면 조인 테이블의 다음 항목으로 끝납니다.

a1_id, b_id
a2_id, b_id

그러나로드 할 때 JPA는 A1이 아닌 A2에 대해 B에만 알려 주려고한다는 것을 어떻게 알 수 있습니까? 그리고 B에 대해 알지 못하는 A2는 어떻습니까?

그렇기 때문에 양방향 연관성을 직접 유지 해야하는 이유입니다 (위의 예제를 메모리에서도 불가능하게 만들고) JPA는 한쪽의 상태에 따라 지속됩니다.

다른 팁

역 결합 열을 지정 했습니까?

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

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

a_id 및 b_id 열이있는 a_b라는 조인 테이블을 가정합니다.

관계가 양방향이므로 응용 프로그램이 관계의 한 쪽을 업데이트함에 따라 상대방도 업데이트되고 동기화되어야합니다. JPA에서는 일반적으로 Java에서와 같이 관계를 유지하는 것은 응용 프로그램 또는 객체 모델의 책임입니다. 응용 프로그램이 관계의 한쪽에 추가되면 다른쪽에 추가해야합니다.

이는 관계의 양쪽을 처리하는 객체 모델의 추가 또는 설정 메소드를 통해 해결할 수 있으므로 응용 프로그램 코드는 걱정할 필요가 없습니다. 이에 대한 두 가지 방법이 있습니다. 관계 유지 보수 코드를 관계의 한쪽에 추가하고 한쪽에서 세터를 사용하거나 (예 : 다른 쪽을 보호하는 등) 양쪽 및 양쪽에 추가 할 수 있습니다. 무한 루프를 피하십시오.

원천: onetomany#getters_and_setters

Class B의 A 필드에 매핑 된 매개 변수를 추가하려고 시도 했습니까?

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

A_M의 대답에는 작은 실수가있을 수 있습니다. 내 생각에 그것은 다음과 같아야한다.

   @Entity
   class B { 
   @ManyToMany 
   @JoinTable (
       name="A_B",
       joinColumns = {@JoinColumn(name="B_ID")},
       inverseJoinColumns = {@JoinColumn(name="A_ID")}
   )
   private List a; 
   .. 
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top