2012-05-02 4 views
3

나는 이것과 매우 비슷한 문제가있다 : How do I join tables on non-primary key columns in secondary tables? 하지만 같은 솔루션을 적용 할 수 있을지 모르겠다.외래 키를 사용하여 두 테이블을 하나의 엔티티에 매핑하는 방법은 무엇입니까?

나는이 같은 두 개의 테이블이 있습니다

CREATE TABLE CUSTOMER 
(
    CUSTOMER_ID INTEGER NOT NULL, 
    DETAIL_ID INTEGER NOT NULL, 
    PRIMARY KEY(CUSTOMER_ID), 
    CONSTRAINT cust_fk FOREIGN KEY(DETAIL_ID) REFERENCES DETAILS(DETAIL_ID) 
) 

CREATE TABLE DETAILS 
(
    DETAIL_ID INTEGER NOT NULL, 
    OTHER INTEGER NOT NULL, 
    PRIMARY KEY(DETAIL_ID) 
) 

내가 Customer라는 하나의 클래스에이 테이블을지도하고 싶습니다, 그래서 내가 가진 :

@Entity 
@Table(name = "CUSTOMERS") 
@SecondaryTable(name = "DETAILS", [email protected](name="DETAIL_ID")) 
public class Customer { 
    @Id 
    @GeneratedValue 
    @Column(name = "CUSTOMER_ID") 
    private Integer id; 

    @Column(table = "DETAILS", name = "OTHER") 
    private Integer notes; 

    // ... 
} 

을하지만 이것은 단지 DETAIL_ID을 경우 작동 1 차 테이블에 CUSTOMER_ID과 일치합니다.

제 질문은 : 어떻게 보조 테이블의 기본 키에 가입하려면 기본 테이블의 외래 키 필드를 사용할 수 있습니까?


UPDATE 내가 설정하려고 :

@SecondaryTable(name = "DETAILS", [email protected](name="DETAIL_ID", referencedColumnName="DETAIL_ID"))

을하지만 응용 프로그램을 실행할 때 나는이 예외가 얻을 :

org.hibernate.MappingException: Unable to find column with logical name: DETAIL_ID in org.hibernate.mapping.Table(CUSTOMERS) and its related supertables and secondary tables

+0

두 테이블이 있으므로 하나의 테이블에 결합하고 싶습니까? –

+0

@SerenityStackHolder 네, 하나의 엔티티에 두 개의 테이블을 매핑하고 싶습니다. 하지만 보조 테이블에 기본 테이블에 외래 키가 있습니다. – davioooh

답변

0

당신은 referenceColumnName을 사용할 수 있습니다의 속성주석을 사용하여 참조 된 테이블에 대한 조인 열을 정의합니다. 사실, name/referencedColumnName의 사용을 조합하면 양쪽에서 임의로 조인 할 수 있습니다. 중복이 발견되면 ORM 공급자는 예외를 throw합니다.

+0

내 질문이 업데이트되었습니다. – davioooh

3

@SecondaryTable을 사용하면 두 개의 테이블을 기본이 아닌 키 열과 조인 할 수 없습니다. 왜냐하면 Hibernate는 기본적으로 기본 키로 두 테이블을 결합하려고 시도하기 때문입니다.

고객 등급 :

@Entity 
@Table(name="CUSTOMERS") 
public class Customer { 

    @Id 
    @GeneratedValue 
    @Column(name="CUSTOMER_ID") 
    private Integer id; 

    @ManyToOne 
    @JoinColumn(name="DETAIL_ID") 
    private Details details; 

    // Getter and Setter methods... 
} 

세부 등급 :

@Entity 
@Table(name="DETAILS") 
public class Details { 

    @Id 
    @GeneratedValue 
    @Column(name="DETAIL_ID") 
    private int detailId; 

    @Column(name="OTHER") 
    private String other; 

    @OneToMany(mappedBy="details") 
    private Set<Customer> customers; 

    // Getter and Setter methods... 
} 

이 쉽게 당신이 솔루션을 @OneToMany 검토 http://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/를 사용할 필요가 여기에 URL이 작동을 멈 춥니 다 경우에 코드입니다 다음 코드를 사용하여 최대 절전 모드를 통해 액세스 할 수 있습니다.

Session session = HibernateUtil.getSessionFactory().openSession(); 
Query query = session.createQuery("select id, details.other from Customer"); 

나는 이것이 나가 나가 한처럼 이것을 달성하는 방법을 찾는 지출 시간 보내는 누군가를 돕는 는다는 것을 희망한다.

관련 문제