3

これと非常によく似た問題があります:セカンダリ テーブルの主キー以外の列でテーブルを結合するにはどうすればよいですか? しかし、同じ解決策を適用できるかどうかはわかりません。

次のような 2 つのテーブルがあります。

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", pkJoinColumns=@PrimaryKeyJoinColumn(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", pkJoinColumns=@PrimaryKeyJoinColumn(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

4

2 に答える 2

3

これに対する答えを探している人にとって、 @SecondaryTable を使用することは、非主キー列を持つ 2 つのテーブルを結合する方法ではありません。これは、Hibernate がデフォルトで主キーによって 2 つのテーブルを関連付けようとするためです。解決策として@OneToMany レビューhttp://viralpatel.net/blogs/hibernate-one-to-many-annotation-tutorial/を使用する必要があります。URL が機能しなくなった場合のコード スニペットを次に示します。

顧客クラス:

@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...
}

これは、次のコードを使用して休止状態から簡単にアクセスできます。

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

これが、私のようにこれを達成する方法を探すのに何時間も費やしている人に役立つことを願っています.

于 2014-06-20T19:51:08.573 に答える
0

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

于 2012-05-02T16:57:07.950 に答える