2012-03-02 3 views
1

나는 Hibernate JPA 2.0, Spring 3, MS SQL 서버를 사용하고 있습니다. Level0, Level1, level2 및 Level3의 네 테이블이 있습니다. Level0의 기본 키는 P0입니다. Level1은 level0의 P0와 FK 및 P1의 compsoite 기본 키를 가지고 있습니다. Level2에는 Level0.P0, Level1.P1 및 P2와 같은 복합 키가 있습니다. 등등. 테이블 정의는 다음과 같습니다.org.hibernate.AnnotationException : referencedColumnNames (P0, P1, P2) ... 단일 속성에 매핑되지 않았습니다.

CREATE TABLE Level0 
(
    P0 integer NOT NULL, 
    Level0_name varchar(50) NOT NULL, 
    PRIMARY KEY (P0) 
); 

CREATE TABLE Level1 
(
    P0 integer NOT NULL, 
    P1 varchar(10) NOT NULL, 
    Level1_Name varchar(60), 
    PRIMARY KEY (P0, P1) 
); 
ALTER TABLE Level1 ADD CONSTRAINT FK_Level1 FOREIGN KEY (P0) REFERENCES Level0(P0); 

CREATE TABLE Level2 
(
    P0 integer NOT NULL, 
    P1 varchar(10) NOT NULL, 
    P2 varchar(10) NOT NULL, 
    Level2_Name varchar(20), 
    PRIMARY KEY (P0, P1, P2) 

); 
ALTER TABLE Level2 ADD CONSTRAINT FK_Level2 
FOREIGN KEY (P0, P1) REFERENCES Level1(P0, P1); 

CREATE TABLE Level3 
(
    P0 integer NOT NULL, 
    P1 varchar(10) NOT NULL, 
    P2 varchar(10) NOT NULL, 
    P3 varchar(10) NOT NULL, 
    Level3_Name varchar(20) NOT NULL, 
    PRIMARY KEY (P0, P1, P2, P3) 
); 
ALTER TABLE Level3 ADD CONSTRAINT FK_Level3 
FOREIGN KEY (P0, P1, P2) REFERENCES Level2(P0, P1, P2); 

각 테이블에 해당하는 Java 클래스가 있습니다. 그래서 Level0에는 Level1s ​​컬렉션이 있고 Level1에는 Level2s 컬렉션이 있습니다. Level3에는 Level2 객체가 포함되고 Level2에는 Level1 객체가 포함됩니다. 다음은 Level1 및 Level2의 Java 클래스입니다.

@Entity 
@Table(name="Level1") 
public class Level1 extends DomainObject 
{ 
    private String p1; 
    private Level0 level0; 
    private String name; 
    private List<Level2> level2s = new ArrayList<Level2>(); 

    @Id 
    @NotNull 
    @Column(name="P1") 
    public String getP1() 
    { 
     return(p1); 
    } 

    @NotNull 
    @ManyToOne(cascade={CascadeType.DETACH, 
       CascadeType.MERGE, 
       CascadeType.PERSIST, 
       CascadeType.REFRESH}) 
    @JoinColumn(name="P0", 
      referencedColumnName="P0") 
    public Level0 getLevel0() 
    { 
     return(level0); 
    } 

} 
---------------------------------------------------------- 
@Entity 
@Table(name="Level2") 
public class Level2 extends DomainObject 
{ 
    private String p2; 
    private Level1 level1; 
    private String name; 
    private List<Level3> level3s = new ArrayList<Level3>(); 

    @Id 
    @NotNull 
    @Column(name="P2") 
    public String getP2() 
    { return(p2); 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumns({ 
     @JoinColumn(name="P0", referencedColumnName="P0"), 
     @JoinColumn(name="P1", referencedColumnName="P1") 
    }) 
    public Level1 getLevel1() 
    { return(level1); 
    } 

    @NotNull 
    @Column(name="Level2_Name") 
    public String getName() 
    { return(name); 
    } 

    @OneToMany(orphanRemoval=true, 
    cascade=CascadeType.ALL, 
    mappedBy="level2", 
    fetch = FetchType.LAZY) 
    public List<Level3> getLevel3s() 
    { 
    return(level3s); 
    } 
} 

이러한 Level0, Level1 및 Level2 간의 관계는 훌륭합니다. 코드가 올바르게 작동합니다. Level3 클래스를 추가하면 오류가 발생합니다. 다음은 Level3의 모습입니다. 하나의 속성에 매핑되지 참조 레벨 2의 Level3.level2으로 referencedColumnNames (P0, P1, P2) org.hibernate.AnnotationException : 의해 발생 :

public class Level3 extends DomainObject 
{ 
    private String p3; 
    private Level2 level2; 
    private String name; 


    @Id 
    @NotNull 
    @Column(name="P3") 
    public String getP3() 
    { 
     return(p3); 
    } 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumns({ 
     @JoinColumn(name="P0", referencedColumnName="P0"), 
     @JoinColumn(name="P1", referencedColumnName="P1"), 
     @JoinColumn(name="P2", referencedColumnName="P2") 
    }) 
    public Level2 getLevel2() 
    { 
     return(level2); 
    } 

    @NotNull 
    @Column(name="Level3_Name") 
    public String getName() 
    { 
     return(name); 
    } 

} 

I는 다음과 같은 오류가.

Level2에는 2 개의 외래 키와 고유 한 필드가 있으며 3 개는 복합 기본 키입니다. 그리고 그것은 작동합니다. 그러나 Level3에는 3 개의 외래 키가 있습니다. 그리고 그렇지 않습니다.

누군가가 도와 줄 수 있습니까? 감사.

답변

0

이 도움이 될 수 있습니다,하지만 난 모르겠어요이 그것을 할 수있는 올바른 방법 인 경우 : 나도 같은 오류를 제공하는 비슷한 상황이 있었다

,하지만 내 복합 FK-S가되지 않은 경우 기본 키에 연결되지만 논리적 인 고유 키로 연결됩니다. 관계의 각 구성 요소에 대해 추가 필드를 만들어 해결했습니다. 레벨 2에서 귀하의 경우

즉 내 최대 절전 모드가 오류없이 복합 관계를 해결 할 수있었습니다이와

@Entity 
@Table(name="Level2") 
public class Level2 extends DomainObject 
{ 
    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name="P0", referencedColumnName="P0", insertable=false, updatable=false) 
    private Level0 level0Dummy; 
    // getter setter... 
} 

을 추가합니다.

p.s. 기본 복합 키를 올바르게 매핑하지 않은 것으로 보입니다 (복합 기본 키는 기본 키 표현으로 내장 클래스를 사용함). 체크 아웃 http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#d0e2177

관련 문제