1

次の 2 つのエンティティがあります。

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    ...
}

@Entity
public class Man extends Person {
    ...
}

次のメソッドを実行しようとしています:

@Test
public void clear(EntityManager em) {
    EntityTransaction tx = em.getTransaction();
    tx.begin();
    System.out.println(em
            .createQuery("delete from Man m where m.id > 14582647")
            .executeUpdate());
    tx.commit();
}

エラーを取得します。

[ERROR] ORA-00918: column ambiguously defined

hibernate.show_sql は、SQL クエリを示します。

Hibernate: insert into HT_Man select man0_.id as id from Man man0_ inner join Person man0_1_ on man0_.id=man0_1_.id where id=14582647
Hibernate: delete from HT_Man

エラーはid = 14582647の場所で発生します。これは、 idだけでなく、たとえばman0_.idが存在する必要があるためです。正しい sql-query を生成するには?

4

1 に答える 1

1

Manクラスに@PrimaryKeyJoinColumnアノテーションを追加します。

@Entity
@PrimaryKeyJoinColumn(name = "<pk column name in Man table>")
public class Man extends Person {
    ...
}

また、PersonでDiscriminator列を定義し、Manで@DiscriminatorValueを定義して、Hibernateがどのテーブルを結合するかを判断できるようにする必要があります(たとえば、Womanテーブルを導入する場合)。

于 2013-01-28T18:01:16.637 に答える