2009-03-21 2 views
15

JPA에 엔트리와 코멘트라는 엔티티가 2 개 있습니다. 엔트리는 두 개의 Comment 객체 콜렉션을 포함합니다. 객체JPA에서 같은 유형의 컬렉션 2 개를 얻는 방법?

create table Entry_Comment (Entry_id integer not null, postMortemComments_id integer not null, pmnr integer not null, descriptionComments_id integer not null, dnr integer not null, primary key (Entry_id, dnr), unique (descriptionComments_id), unique (postMortemComments_id))

보관 descriptionComments_id으로 실패 postMortemComments_id은 할 수 없습니다

@Entity 
public class Entry { 
    ... 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @IndexColumn(base = 1, name = "dnr") 
    private List<Comment> descriptionComments = new ArrayList<Comment>(); 

    @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    @IndexColumn(base = 1, name = "pmnr") 
    private List<Comment> postMortemComments = new ArrayList<Comment>(); 

    ... 
} 

같은 객체를 저장하기 위해, JPA + Hibernate는 "항목"테이블은 테이블 SINGLE "Entry_Comment를", "코멘트"작성 "not null"동시에.

JPA + Hibernate를 사용하여 동일한 유형의 두 개의 콜렉션을 포함하는 객체를 어떻게 저장합니까?

답변

13

이것은 많은 Hibernate 버그들 중 하나입니다 (정확하게 말하면 HHH-3410).

개의 주석을 @OneToMany 개의 관계에 추가하여 문제를 해결했습니다. 각각 고유 한 테이블 이름이 있습니다.

귀하의 경우는 다음과 같을 것이다 :

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(name="entity_descriptioncomments") 
@IndexColumn(base = 1, name = "dnr") 
private List<Comment> descriptionComments = new ArrayList<Comment>(); 

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
@JoinTable(name="entity_postmortemcomments") 
@IndexColumn(base = 1, name = "pmnr") 
private List<Comment> postMortemComments = new ArrayList<Comment>(); 

을 : 당신은뿐만 아니라 @IndexColumn 주석을 추가해야합니다 (때문에 여러 EAGER 가방 다른 최대 절전 모드 문제의 : HHH-1718/EJB-346).

+0

그리고이 관계를 양방향으로 만드는 방법은 무엇입니까? –

4

DataNucleus (http://www.datanucleus.org)을 사용하여 JPA 에서처럼 2 개의 콜렉션을 저장하려면 이전과 완전히 동일하게 수행하십시오. @JoinTable 주석이 없으므로 FK는 각 컬렉션에 대해 Comment에 있어야합니다. 실제로 @JoinTable 어딘가에 (또는 XML과 동등한) 경우 각각의 조인 테이블 (각 컬렉션에 하나씩)의 이름을 설정하면 작업 할 수 있습니다 (따라서 테이블에 자체 조인 테이블이 있음). DataNucleus에서도 두 개의 콜렉션간에 공유 조인 테이블을 만들 수 있지만 표준 JPA가 아닌 벤더 확장입니다.

그 스펙 ;-)

2

데의 포인트는 데이터 모델에서 현재 매핑 결함이 내가 아무 생각했습니다,하지만 다음이 JPA 그래서 그게부터 일관성이 있어야이다 최대 절전 모드로 매핑하는 방법/보기의 도메인 모델 점 : 당신은 actaully 하나의@OneToMany 관계 항목 사이 코멘트 있습니다. '설명'또는 '사후': 그리고 코멘트 개체는 하나 개 이상의 속성이 2 개 형 값을 사용라고해야한다.

는 (아마도 JPA의 상속 기능을 사용) 및 @JoinTable 주석의 항목를 사용하여 2 개의 다른 엔티티로 코멘트 엔티티를 분해하는 것이 좋습니다 항목 기업의 현재 구현 인라인합니다.

0

두 가지 인덱스 열 정의를 같은 이름으로 구성하는 방법에 대해 신경 쓰는 것이 어떻습니까?

+0

시도했습니다. Hibernate는 여전히 예외를 throw합니다. –

관련 문제