나는 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 개의 외래 키가 있습니다. 그리고 그렇지 않습니다.
누군가가 도와 줄 수 있습니까? 감사.