2013-07-17 3 views
0

나는 분명히 이것을 첫 번째 시도로 설명 할 수 있기를 바랍니다. 그래서 나는 두 개체 : 사람과 주소가 있습니다. 한 사람은 많은 주소를 가질 수 있으므로 내 Person 엔티티는 주소 목록으로 구성됩니다. 주소는 여러 사람이 공유 할 수 있지만 주소 엔티티에는 Person 엔티티에 대한 참조가 필요하지 않습니다. 또한 각 주소 엔터티는 순위 특성을 갖습니다. 다음과 같이JPA - JoinTable이있는 @OneToMany

내 테이블 구조는 다음과 같습니다

PERSON (
    person_id, 
    etc, 
    primary key (person_id) 
) 

ADDRESS (
    address_id, 
    etc, 
    primary key (address_id) 
) 

PERSON_ADDRESS_MAP (
    person_id, 
    address_id, 
    rank, 
    foreign key (person_id) references person (person_id), 
    foreign key (address_id) references address (address_id), 
    primary key (person_id, address_id, rank) 
) 

위를 감안할 때, 내 사람의 주소 목록 또는 주소의 순위 속성을 주석하는 방법을 모르겠어요. 나는 다음과 같이 사람의 모양을 의심 :

@Entity 
public class Person { 
    @OneToMany(cascade = CascadeType.ALL, fetch=FetchType.EAGER) 
    @JoinTable(name="person_address_map", [email protected](name="person_id"), [email protected](name="address_id")) 
    private List<Address> addresses; 
    ... 
} 

내가 주소 엔티티에 순위을 주석하는 방법에 대한 단서입니다. 사전에 모든

+0

텍스트는 순위가 Address에 있지만 테이블 설명에 PERSON_ADDRESS_MAP에 있다고 표시합니다. 어느 것이 사실입니까? –

+0

모두 사실입니다. 순위는 주소 엔티티의 속성이지만 한 사람의 한 주소가 다른 사람의 주소와 다른 순위 일 수 있기 때문에 조인 테이블에 저장됩니다. 예를 들어, Bob은 첫 번째 주소로 'A'를 순위 지정하지만 Mary (동일한 주소에 사는 사람)는 두 번째 주소로 'A'를 순위 지정합니다. – user1491636

답변

0

최초의

덕분에, 사람과 주소 사이의 논리적 관계는 다 대다, 사람이 많은 주소를 가지고 있으며, 주소가 여러 사람에 의해 공유되고 있기 때문이다.

계급은 주소의 속성입니다. 그러나 지정된 주소의 순위는 1 (Bob의 경우) 또는 2 (Mary의 경우)가 될 수 있습니다. 이것은 순위가 Address의 속성이 아니라는 것을 간단히 보여줍니다 (테이블 모델은이를 분명하게 보여줍니다).

그래서, 문제에 대한 해결책은 간단하다 : 당신이 엔티티에 PERSON_ADDRESS_MAP 테이블을 매핑 할 수 있습니다

public class Person { 
    @OneToMany(mappedBy = "person") 
    private Set<RankedAddress> rankedAddresses; 
} 

public class RankedAddress { 
    @ManyToOne 
    private Person person; 

    @ManyToOne 
    private Address address; 
} 

public class Address { 
    @OneToMany(mappedBy = "adress") 
    private Set<RankedAddress> rankedAddresses; 
} 

나는 또한 단일 열을 추가, 모든 엔티티로, 조언, 자동 생성 ID (및 해당 열)를 PopularityAddress 엔터티에 추가합니다.

순위가 유일한 조인 테이블이고 각 주소의 색인을 개인 주소록에 포함하는 경우 (즉, 0에서 N-1로 이동하는 경우 N은 a의 주소 수임) 사용자는) 다음지도하도록 강요하지 않는 대안은 엔티티 테이블이 결합되어 열 값이 완전히 JPA에 의해 처리됩니다

public class Person { 
    @ManyToMany 
    @OrderColumn(name = "rank") 
    private List<Address> addresses; 
} 

참고하고 만 것입니다 목록의 지정된 색인에 모든 주소를 저장하는 데 사용됩니다. 쿼리에는 사용할 수 없으며 목록에서 인덱스를 가져 오는 것 외에는 사용자의 주소 순위를 알 수 없습니다.

+0

대안은 내가 찾고있는 것이었다. 감사! – user1491636