2012-05-02 2 views
3

私はこれに非常に似た問題があります:How do I join tables on non-primary key columns in secondary tables? しかし、私は同じ解決策を適用できるかどうかはわかりません。外部キーを使用して2つのテーブルを1つのエンティティにマップする方法はありますか。

私はこれらのような二つのテーブルがあります:私はCustomerと呼ばれる単一のクラスにこれらのテーブルをマッピングしたいのですが、私は持っている

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) 
) 

を:

@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の作品プライマリテーブルの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

2つのテーブルがあり、1つのテーブルにそれらを結合しますか? –

+0

@SerenityStackHolderはい、1つのエンティティに2つのテーブルをマップしたいと思います。しかし、プライマリテーブルにセカンダリテーブルの外部キーがあります。 – davioooh

答えて

0

あなたはreferenceColumnNameを使用することができますの属性注釈を使用して、参照先の表に結合列を定義します。実際には、name/referencedColumnNameの使用を組み合わせることで、ORMプロバイダが重複が見つかった場合に例外がスローされるという制約条件で、両側で任意に結合できます。

+0

私の質問が更新されました – davioooh

3

@SecondaryTableを使用すると、2つのテーブルをプライマリキーでデフォルトでアソシエートしようとするため、非プライマリキーカラムと2つのテーブルを結合する方法ではありません。

顧客クラス:

@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"); 

これは私がしたようにこれを達成する方法を探して時間を費やしている誰にも役立つことを願っています。

関連する問題