2012-06-05 2 views
2

데이타베이스 구조로 인해 조인 열이 기본 클래스의 기본 키가 아닌 ORM 클래스 계층의 객체에 조인 테이블에 문제가 있습니다. 다음은 테이블 디자인의 예입니다 : 여기비 기본 키 열의 테이블을 조인하려면 어떻게합니까?

CREATE TABLE "SCH"."FOO" 
(
     "OWNERID"  NUMBER(10,0) NOT NULL ENABLE, 
     "FOOID"   NUMBER(10,0) NOT NULL ENABLE, 
     CONSTRAINT "FOO_PK" PRIMARY KEY ("OWNERID", "FOOID") 
     CONSTRAINT "FOO_FK1" FOREIGN KEY ("OWNERID") REFERENCES "SCH"."OWNERS" ("OWNERID") ENABLE 
) 

CREATE TABLE "SCH"."BAR" 
(
     "BARID"    NUMBER(10,0) NOT NULL ENABLE, 
     "FOOID"    NUMBER(10,0) 
     CONSTRAINT "BAR_PK" PRIMARY KEY ("BARID") 
) 

그리고는 (unesessary 정보] 제거)

@Entity 
@IdClass(FooId.class) 
@Table(name = "FOO") 
public class Foo implements java.io.Serializable 
{ 
    @Id 
    @Column(name = "OWNERID") 
    private BigInteger ownerId; 

    @Id 
    @SequenceGenerator(name = "FOO_GENERATOR", sequenceName = "SEQ_FOO") 
    @GeneratedValue(generator = "FOO_GENERATOR") 
    @Column(name = "FOOID") 
    private BigInteger id; 

    @OneToMany(fetch = FetchType.LAZY) 
    @JoinColumn(name = "FOOID", referencedColumnName = "FOOID") 
    @Fetch(value = FetchMode.SUBSELECT) 
    @Cascade(value = {CascadeType.ALL}) 
    private Set<Bar> bar = new LinkedHashSet<Bar>(0); 
} 


@Entity 
@Table(name = "BAR") 
public class Bar implements java.io.Serializable 
{ 
    @Id 
    @Column(name = "BARID") 
    private BigInteger id; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "FOOID", referencedColumnName = "FOOID") 
    private Foo foo; 
} 

이 예외와 함께 실패 매핑은 다음과 같습니다

Caused by: org.hibernate.AnnotationException: referencedColumnNames(FOOID) of com.package.Bar.foo referencing com.package.Foo not mapped to a single property 
    at org.hibernate.cfg.BinderHelper.createSyntheticPropertyReference(BinderHelper.java:204) 
    at org.hibernate.cfg.ToOneFkSecondPass.doSecondPass(ToOneFkSecondPass.java:114) 
    at org.hibernate.cfg.Configuration.processEndOfQueue(Configuration.java:1580) 
    at org.hibernate.cfg.Configuration.processFkSecondPassInOrder(Configuration.java:1503) 
    at org.hibernate.cfg.Configuration.secondPassCompile(Configuration.java:1419) 
    at org.hibernate.cfg.Configuration.buildMappings(Configuration.java:1375) 

수 당신하시기 바랍니다 솔루션에 대한 도움이 필요하십니까? 다음과 같이 U 할 수

답변

4

당신은 두 번 양방향 연관을 매핑 할 수 없습니다. 일측은 mappedBy 특성을 이용하여, 많은 쪽의 역수로 표시되어야

@OneToMany(fetch = FetchType.LAZY, mappedBy = "foo") 
@Fetch(value = FetchMode.SUBSELECT) 
@Cascade(value = {CascadeType.ALL}) 
private Set<Bar> bar = new LinkedHashSet<Bar>(0); 

... 

@ManyToOne(fetch = FetchType.LAZY) 
@JoinColumn(name = "FOOID", referencedColumnName = "FOOID") 
private Foo foo; 

협회가 가입 열 FOOID로 매핑됨을 회 절전 말할 이유는 없다. 그리고 실제로는 하나의 양방향 연관보다는 두 개의 다른 단방향 연관을 정의하기 때문에 오류가 발생합니다.

편집

위의 작동하지만 다음과 같은 이유로 최대 절전 모드 버그하지 않습니다해야합니다 : 그것은 최대 절전 모드 버그입니다. HHH-4284을 참조하십시오.

FOOID은 고유성을 보장하기에 충분하기 때문에 해결 방법은 소유자 ID에서 @Id 주석을 제거하고 @IdClass 주석을 제거하는 것입니다.

+1

com.package.Bar.foo를 참조하는 com.package.Foo를 참조하는 referencedColumnNames (FOOID)가 하나의 속성에 매핑되지 않았습니다. – Dzmitry

+1

이것은 최대 절전 모드 버그입니다. https://hibernate.onjira.com/browse/HHH-4284를 참조하십시오. OTOH, FOOID가 고유성을 보장하기에 충분하기 때문에 소유자 ID에서 @Id 주석을 간단히 제거 할 수 없었습니까? –

+0

@ Id 주석을 소유자 ID에서 제거하고 @ IdClass를 제거하는 것은 예상대로 작동하지 않지만 어떻게 든 작동합니다. 게시물을 다른 답변으로 보내 주시면 솔루션으로 받아 들일 수 있습니까? 고맙습니다. – Dzmitry

1

는 .... 그것을 작동합니다 -

@Entity 
@IdClass(FooId.class) 
@Table(name = "FOO") 
public class Foo implements java.io.Serializable 
{ 
    @Id 
    @Column(name = "OWNERID") 
    private BigInteger ownerId; 

    @Id 
    @SequenceGenerator(name = "FOO_GENERATOR", sequenceName = "SEQ_FOO") 
    @GeneratedValue(generator = "FOO_GENERATOR") 
    @Column(name = "FOOID") 
    private BigInteger id; 

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) 
    @JoinColumn(name = "FOOID",nullable=false) 
    @ForeignKey(name = "fk")  
    private Set<Bar> bar = new LinkedHashSet<Bar>(0); 
} 


@Entity 
@Table(name = "BAR") 
public class Bar implements java.io.Serializable 
{ 
    @Id 
    @Column(name = "BARID") 
    private BigInteger id; 

    @ManyToOne(fetch=FetchType.LAZY) 
    @JoinColumn(name = "FOOID", updatable = false, insertable = false, nullable=false) 
    private Foo foo; 
} 
+1

작동하지 않는다 : com.package.Bar의 com.package.Foo를 참조하는 외래 키가 잘못된 열 번호를가집니다. 2가되어야합니다. – Dzmitry

0

FOO 테이블에서 복합 기본 키를 사용했습니다. 따라서 @EmbeddedId 속성을 시도해야하며 FOO 엔터티와 조인하는 BAR 엔터티에 두 개의 열 "OWNER_ID"및 "FOO_ID"가 필요합니다.

+0

나도 알아,하지만 DB 구조를 변경할 수 없습니다 : ( – Dzmitry

관련 문제