2

IDを列にマップするユーティリティ基本クラスから拡張しています

@MappedSuperclass
public abstract class BaseDTO
{
     @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public int id;
    public int getId() {
        return id;}

    public void setId(int id) {
        this.id = id;}
}

このクラスは、id 列を含むテーブルへのアクセスと操作を簡素化するために、多くの派生クラスで使用されます。すなわち

BaseDTO->DBAbstractClass1->DBAbstract2->MyClassDTO
BaseDTO->DBAbstractClass1->DBAbstract3->AnotherADTO
BaseDTO->DBAbstractClass2->DBAbstract4->AnotherBDTO

ここで、「id」列を持たない MyClassDTO にマップされたテーブルがあることがわかりました (「identifier」という列があります) が、アーキテクチャの制約により、通常の原因に従って拡張されます。

[org.hibernate.util.JDBCExceptionReporter] SQL Error: 1054, SQLState: 42S22
[org.hibernate.util.JDBCExceptionReporter] Unknown column 'this_.id' in 'field list'

id メンバーを @Transient としてオーバーライドし、新しい @Id などを追加しようとしましたが、常に上記のエラーが発生します。

継承された id を「無視」または置換する方法を見つけるか、継承されたクラスをコピーして BaseDTO を拡張しないようにする必要があります。これは、優れたプログラマーが避けるべきことです。

Hibernateで似たようなものを見たことが あります: マップされたスーパークラスから属性をオーバーライドする方法ですが、 それが私の正確な問題を解決するかどうかはわかりません。

おそらく単純なオーバーライドですが、副作用がないことに注意してください。テイカーはいますか?

4

2 に答える 2

1

私はこれに対する単純でエレガントな解決策を見つけられませんでした。

私が行ったことは、階層を逆にして2つのHelperDTOクラスを作成することです。一方は他方を拡張し、もう一方はidプロパティを含みます。HelperDTOにはIdメンバーがなく、HelperWithIdDTOにはIdメンバーがあります。

HelperDTO->MyClassDTO (classes that do not use id)

HelperDTO->HelperWithIdDTO->OtherDTO (classes that use id)
于 2012-05-08T13:28:59.123 に答える
0

スーパーにこれらの変更を加えて、サブクラスでオーバーライドしてみてください。

@MappedSuperclass
public abstract class BaseDTO
{

    public int id;
    public int getId() {
        return id;}

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    public void setId(int id) {
        this.id = id;}
}
于 2012-05-03T16:09:58.327 に答える