2012-10-23 4 views
0

두 엔티티를 one to many 방식으로 매핑하려고합니다.JPA @SecondaryTable 외래 키 위반

A->[B, B] 

나는 더 많은 필드를 join table에 추가하고 싶습니다.

@Entity 
@Table(name = "A", schema = "examples") 
@SecondaryTable(name = "A_B", pkJoinColumns = @PrimaryKeyJoinColumn(name = "a_id", referencedColumnName = "id")) 
public class A 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 

    @Basic 
    private String name; 

    @Basic 
    private Integer field1; 

    @Column(table = "A_B", name = "field2") 
    private Integer field2; 

    @OneToMany(cascade = {CascadeType.ALL}) 
    @JoinTable(name = "A_B", joinColumns = {@JoinColumn(name = "a_id")}, inverseJoinColumns = {@JoinColumn(name = "b_id")}) 
    private List<B> datastores; 
} 


@Entity 
@Table(name = "B", schema = "examples") 
@SecondaryTable(name = "A_B", pkJoinColumns = @PrimaryKeyJoinColumn(name = "b_id", referencedColumnName = "id")) 
public class B 
{ 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Integer id; 


    @Basic 
    private String field1; 

    @Basic 
    private int field2; 

    @Column(table = "A_B", name = "field3") 
    private int field3; 
} 

것 추가하기 위해 내가 A_B 테이블에 foreign key을 제거해야한다는 것입니다 : 같은 Pojos 보인다. foreign keys을 허용하는 매핑을 어떻게 해결합니까?

감사합니다.

답변

2

뭔가 빠졌지 만 엔티티 A와 엔티티 B가 모두 테이블 "A_B"에 매핑되는 이유가 없습니다. 엔티티 A에 보조 테이블로 추가하면 테이블 a에 대한 삽입이 발생할 때마다 테이블 A_B에 대한 삽입이 발생해야하므로 두 테이블의 행간에 엄격한 1 : 1 관계가 작성되어야합니다. 엔티티 B와 동일한 작업을 수행한다는 점을 제외하고는 A_id = somevalue 및 B_id = null로 된 A_B의 행과 b_id = somevalue 인 동안 a_id = null 인 행으로 끝납니다. 테이블 "A_B"는 관계 테이블과 비슷해 보입니다. 따라서 이것은 아마도 당신이 원하는 것이 아닙니다.

A_B가 관련 테이블 인 경우 "A_B"테이블에 대한 ManyToMany를 사용하여 매핑해야합니다. 채워야하는 추가 필드가있는 경우 AB 엔터티를 만들고 A-> AB 및 B-> AB 및 AB-> A 및 AB-> B의 ManyToOne에서 OneToMany를 만듭니다.

관련 문제