12

アノテーションを使用してHibernateマッピングを定義することを検討していますが、問題が発生しました。基本エンティティクラスを使用して共通フィールド(IDフィールドを含む)を定義したいのですが、異なるテーブルに異なるID生成戦略を持たせたいです。

@MappedSuperclass
public abstract class Base implements Serializable {
    @Id
    @Column(name="ID", nullable = false)
    private Integer id;
    public Integer getId(){return id;}
    public void setId(Integer id){this.id = id;}
    ...
}

@Entity
@Table(name="TABLE_A")
public class TableA extends Base {
    // Table_A wants to set an application-defined value for ID
    ...
}

@Entity
@Table(name="TABLE_B")
public class TableB extends Base {
    // How do I specify @GeneratedValue(strategy = AUTO) for ID here?
    ...
}

これを行う方法はありますか?私は以下をに含めようとしましTableBたが、休止状態は同じ列を2回持つことに反対し、それは間違っているようです。

@Override // So that we can set Generated strategy
@Id
@GeneratedValue(strategy = AUTO)
public Integer getId() {
    return super.getId();
}
4

4 に答える 4

4

上記のコードでは、フィールド (スーパークラス) とメソッド (サブクラス) の注釈が混在しているように見えます。Hibernate のリファレンス ドキュメントでは、これを回避することを推奨しており、それが問題の原因であると思われます。Hibernate での私の経験では、とにかくフィールドではなく getter/setter メソッドに注釈を付ける方が安全で柔軟性が高いため、可能であればその設計に固執することをお勧めします。

問題の解決策として、 Base スーパークラスからidフィールドを完全に削除することをお勧めします。代わりに、そのフィールドをサブクラスに移動し、抽象getId()およびsetId()メソッドを Base クラスに作成します。次に、サブクラスでgetId()およびsetId()メソッドをオーバーライド/実装し、必要な生成戦略でゲッターに注釈を付けます。

お役に立てれば。

于 2008-11-30T00:03:14.463 に答える
3

私の解決策:

Baseクラスを次のようにリファクタリングします。

@MappedSuperclass
abstract class SuperBase<K> {
    public abstract K getId();
}

@MappedSuperclass
class Base<K> extends SuperBase<K> {
    @Id @GeneratedValue(AUTO)
    public K getId() { ... }
}

次に、ほとんどのエンティティ クラスの Base から拡張できます。 をオーバーライドする必要がある場合は@GeneratedValue、それを拡張しSuperBaseて定義するだけです。

于 2011-04-25T04:41:32.557 に答える
3

子のメソッドでは、2 番目の @Id タグを追加しないでください。

@Override // So that we can set Generated strategy
@GeneratedValue(strategy = AUTO)
public Integer getId() {
    return super.getId();
}
于 2008-12-04T08:18:40.793 に答える
1

フィールドではなく getter にアノテーションを付けた場合、サブクラスのメソッドをオーバーライドすると、スーパークラスのアノテーションではなく、そこに配置されたアノテーションが使用されます。

于 2009-01-10T05:01:45.563 に答える