3

hibernateがデータベースに保存するエンティティ属性が欲しいのですが、オブジェクトを再構築するときに設定しようとはしません。

私にはこのようなクラスがあります。

@Entity
class Quote {
    private int itemCost;
    private int quantity;

    public Quote(int itemCost, int quantity) {
        this.itemCost = itemCost;
        this.quantity = quantity;
    }

    public void setItemCost(int itemCost) {
        this.itemCost = itemCost;
    }

    public void setQuantity(int quantity) {
        this.quantity = quantity;
    }

    public int getItemCost() {
        return this.itemCost;
    }

    public int getQuantity() {
        return this.quantity;
    }

    // This attribute "totalCost" has a getter only, no setter. 
    // It causes a runtime error (see below). 
    public int getTotalCost() {
        return this.itemCost * this.quantity;
    }
}

次のデータベーステーブルが欲しいです。

quotes
itemCost   | quantity    | totalCost
------------------------------------
100        | 7           | 700
10         | 2           | 20
6          | 3           | 18

ご覧のとおり、フィールド「totalCost」はから取得できますgetTotalCost()が、setTotalCost()メソッドは必要ありません。私のアプリケーションでは意味がありません。

再度ではないデータベースにフィールドを書き込む必要がある理由setは、この値をデータベースを共有する他のアプリケーション(つまり、グラフィカルインターフェイス)で使用できるようにするためです。

明らかに、実行時に現在このエラーが発生します。

org.hibernate.PropertyNotFoundException: Could not find a setter for property totalCost in class Quote

私は空のセッターを持つことができましたが、これは汚れています。私の実際のコードには、このような約13の「読み取り専用」属性があり、13の空白のセッターがコードを乱雑にしたくありません。

これに対するエレガントな解決策はありますか?

4

1 に答える 1

3

ゲッターがある場合、Hibernateには常にセッターが必要ですか?を参照してください。:

クラスでの使用について

@Entity(access = AccessType.FIELD)そして属性に注釈を付けます。

また

@Transientアノテーションを使用して、データベースに保存してはならないフィールドにマークを付けることができます。@Formulaアノテーションを使用して、Hibernateにフィールドを派生させることもできます(これは、データベースに送信するクエリで数式を使用して行います)。

于 2015-11-04T09:48:51.173 に答える