2

TableTableAのオブジェクトAであるpojoがあります

TableA (int a1,int a2)

テーブルを埋めるために、(int a1、int a2、boolean b3)を返すクエリを実行します(そして複数のデータチェックを実行します)

b3はTableAでは無効ですが、両方に同じpojoを使用したいと思います(これは非常に大きなpojoであり、クエリのためだけに1つ持つことは主要なコードの重複になります)

ポジョで宣言しました

@Transient
Boolean getB3() {..}
void setB3(Boolean b3) {..} 

そして、クエリで、b3値を取得することを期待していると宣言しました。

<return> ...
<return-property name="b3" column="b3"/>
...
</return>

しかし、Hibernateはパラメーターを無視し、「setB3()」を使用しません。@ Transientを削除すると、機能します(そして、当然、テーブルに挿入すると失敗します)。したがって、すべての名前が正しいです。

どうすればこれを修正できますか?

ありがとう!

4

4 に答える 4

3

わかりました、別のアイデア。プロパティを一時的な休止状態としてマークしたので、プロパティをロードも保存もしないと思います。

1つの解決策は、2つのクラスを作成することです。bプロパティのないもの。そして、2番目のものはmappedSuperclassアノテーションを使用して最初のものから拡張されています。

または、デフォルト値(falseなど)を提供するを使用してマッピングを試みることもできます。したがって、「通常」の場合、休止状態の場合は数式を使用してデフォルト値を取得し、特別なクエリの場合は、そのクエリに含まれるロジックを使用します。

于 2009-03-03T19:04:04.630 に答える
0

Id アノテーションはどこにありますか? それはゲッターまたはセッターにありますか、それともフィールドにありますか?

フィールド上にある場合、休止状態はフィールドのみを調べて他の注釈を見つけます。

アクセスの種類

accessType 属性は、@Entity、@EmbeddableSuperclass、@Embeddable では使用できなくなりました。特定のエンティティのアクセス タイプは、@Id または @EmbeddedId アノテーションの位置から推測されます。エンティティのフィールドに @Id がある場合、アクセス タイプはフィールドになり、すべての注釈がフィールドで読み取られます。メソッドについても同じです。@MappedSuperclass (以前の @EmbeddableSuperclass) と @Embeddable は、所有エンティティからアクセス タイプを継承します。

特定のエンティティの @Id でフィールドとメソッドの両方に注釈を付けることは禁止されています。

何らかの理由で、特定のエンティティ内、またはエンティティとその MappedSuperclass/Embeddable の間でアクセス タイプを混在させたい場合は、Hibernate 固有の @AccessType アノテーションを使用できます (詳細については、リファレンス ドキュメントを参照してください)。

これはhttp://www.hibernate.org/398.htmlからのものです

于 2009-02-19T13:20:33.103 に答える
0

フィールドとメソッドに注釈を混在させましたか?

たとえば、これは機能しません:

@Entity
public class A {
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String b;

    private String c;

    public void setB(String b) { this.b = b; }
    public String getB() { return b; }

    @Transient // inconsistent with other annotations
    public void setC(String c) { this.c = c; }
    public String getC() { return c; }
}

一方、これは次のようになります。

@Entity
public class A {
    @Id
    @GeneratedValue
    private Long id;

    @Column
    private String b;

    @Transient // consistent with other annotations
    private String c;

    public void setB(String b) { this.b = b; }
    public String getB() { return b; }

    public void setC(String c) { this.c = c; }
    public String getC() { return c; }
}
于 2009-02-19T13:24:54.793 に答える