2

データベースに3つのテーブルがあります。

create table A (
  a_id int primary key
);

create table B (
  b_id int primary key references A(a_id)
);

create table C (
  c_id int primary key,
  b_id int references B(b_id)
);

そして、次のJPA注釈付きクラスを使用してそれらをモデル化しました。

@Entity(name = "A")
@Table(name = "A")
public class A {
    @SuppressWarnings("unused")
    @Id
    @Column(name = "A_ID")
    private int id;
}

@Entity(name = "B")
@Table(name = "B")
@PrimaryKeyJoinColumns({@PrimaryKeyJoinColumn(name = "B_ID", referencedColumnName = "A_ID")})
public class B extends A {
}

@Entity(name = "C")
@Table(name = "C")
public class C {
    @SuppressWarnings("unused")
    @Id
    @Column(name = "C_ID")
    private int id;

    @SuppressWarnings("unused")
    @OneToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH, CascadeType.DETACH})
    @JoinColumns(value = {
        @JoinColumn(name = "B_ID", referencedColumnName = "B_ID", insertable = false, updatable = false)})
    private B b;
}

これらのクラスをHibernateエンティティマネージャーで使用しようとすると、次のエラーが発生します。

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

referencedColumnNameCからBへの参加を変更A_IDすると、それが幸せになるようです。何故ですか?データベースにあるように関係をモデル化することはできませんか?

4

1 に答える 1

1

欠けていたのは、継承戦略の仕様でした。

@Entity(name = "A")
@Table(name = "A")
@Inheritance(strategy = InheritanceType.JOINED)
public class A {
    @SuppressWarnings("unused")
    @Id
    @Column(name = "A_ID")
    private int id;
}

JPAのデフォルトはですSINGLE_TABLE。これは、クラス階層全体を1つのテーブルにまとめます。

于 2012-08-23T08:07:02.413 に答える