104

com.something.SuperClass:

@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class SuperClass implements Serializable {
    private static final long serialVersionUID = -695503064509648117L;

    long confirmationCode;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO) // Causes exception!!!
    public long getConfirmationCode() {
        return confirmationCode;
    }

    public void setConfirmationCode(long confirmationCode) {
        this.confirmationCode = confirmationCode;
    }
}

com.something.SubClass:

@Entity
public abstract class Subclass extends SuperClass {
    private static final long serialVersionUID = 8623159397061057722L;

    String name;

    @Column(nullable = false)
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

私にこの例外を与えます:

Caused by: org.hibernate.MappingException: Cannot use identity column key
generation with <union-subclass> mapping for: com.something.SuperClass

ID を生成するための最善かつ最も便利な方法は何ですか? 継承戦略を変更したくありません。

4

5 に答える 5

242

ここでの問題は、「クラスごとのテーブル」継承とGenerationType.Auto. MsSQL の ID 列を考えてみましょう。列ベースです。「クラスごとのテーブル」戦略では、クラスごとに 1 つのテーブルを使用し、それぞれに ID があります。

試す:

@GeneratedValue(strategy = GenerationType.TABLE)

于 2009-05-28T22:29:58.830 に答える
8

基になるデータベースとして PostgreSQL を使用した YouTube チュートリアルを見て、ビデオの作成者がデフォルトの @GeneratedValue を使用してアプリを正常に実行していることを確認したので、これはデータベースの方言固有の問題ではないかと思います。私の場合 (基礎となるデータベースは MySQL)、@GeneratedValue 戦略を正確に zoidbeck が提案するように GenerationType.TABLE に変更する必要がありました。

ビデオはこちら: https://www.youtube.com/watch?v=qIdM4KQOtH8

于 2013-03-10T15:52:03.337 に答える
2

私たちの場合、開発と本番用に PostreSQL データベースを使用し、テスト用にインメモリ hsqldb データベースを使用します。どちらの場合もシーケンスを使用して ID を生成しています。どうやらpostgresのGenerationType.AUTOデフォルトSEQUENCEですが、ローカルテストでは失敗しました(hsqldbのデフォルトは別のものにする必要があります)。

したがって、私たちのために働いた解決策は、明示的に使用しますGenerationType.SEQUENCE

于 2014-08-06T21:01:58.807 に答える