0

EmailAlert Bean を DTO として使用して、Hibernate を介してデータを取得します。したがって、私のクラスには、DB にあるフィールドのみが含まれます。しかし、場合によっては、中間データを保持するために、追加のフィールドを EmailAlert に含める必要があります。たとえば、「キャプション」フィールド - Java 側で計算され、ユーザーのロケール、時間などに依存します。

したがって、この問題を解決するためのいくつかのバリエーションがあります。

  1. 追加のプロパティ (例: キャプション) を EmailAlert Bean に追加しますが、DB テーブルのどのフィールドにもマップしません。欠点: この場合、hashCode() と equals() で「キャプション」プロパティを使用しないでください。

    • 本当に問題はありません-フィールドは中間データのみを保持します
    • キャッシュと Hibernate 自体の問題の原因ではないかどうかはわかりません。
      クラスのプロパティを持つのは非常に見苦しいと思いますが、 equals() および hashCode() メソッドで使用しないでください。
      将来、誰かがこのロジックを混乱させる可能性があります。
  2. "caption" プロパティを追加して、EmailAlert を EmailAlertExt として拡張します。そして、引数として EmailAlert を取るコンストラクター。
    しかし、この場合、EmailAlert を EmailAlertExt Bean として DB に再度格納する場合に備えて、水中の石はわかりません。

  3. "caption" プロパティを追加して EmailAlert を EmailAlertExt2 として拡張し、元のオブジェクトへの参照を取得します。この場合、EmailAlertExt2 は元の EmailAlert として動作しますが、追加のプロパティが必要です。EmailAlert を保存する場合、元のオブジェクトへの参照を返す EmailAlertExt2 の getOriginalValue() を呼び出すことができます。欠点:コーディングが多すぎる:)

みんな、これらのソリューションのどれが優れていますか? 誰かが他の提案を持っているかもしれませんか?

4

3 に答える 3

2

'@Transient'を使用すると、dbhibernateにマップされません。このフィールドは無視されます。

于 2012-12-28T16:54:51.777 に答える
1

マップされたフィールドとマップされていないフィールドを分離したいという理由だけで、モデル オブジェクトを拡張することはお勧めできません。適切なガイドラインは、「EmailAlert と EmailAlertX の違いは何ですか? また、どちらを使用するかを明確に定義できますか?」という質問を自問することです。その質問に明確に答えられない場合、または親クラスよりも常にサブクラスを使用していることに気付いている場合は、親クラスが抽象クラスであるか、クラスが多すぎることを示しています。

特定のケースでは、マップされたプロパティとマップされていないプロパティの両方を同じクラスに配置し、マップされていないプロパティをマークして、ORM プロバイダーがそれらを処理しようとしないようにする方が理にかなっています。これを行うには、これらのプロパティに @Transient として注釈を付けます。

public class EmailAlert implements Serializable {
   @Id
   private Long id;

   @Column(name = "recipient")
   private String recipient;

   @Transient
   private transient String caption;

   // Constructor, Getters/Setters, etc
}

また、hashcode/equals メソッドに関するコメントに関して。これらのメソッドに Java Bean のすべてのプロパティを含めることはできませんし、含めるべきではありません。次のプロパティのみを含めます。

  • オブジェクトを一意に識別するために必要
  • オブジェクトのライフサイクル全体で同じ値を持つことが(かなり)保証されています
于 2012-12-28T16:59:12.317 に答える
0

「中間データ」と「Java 側で計算された」ビットのため、現時点で必要な EmailAlert オブジェクトはビジネス オブジェクトのようです。

おそらく、EmailAlertDto オブジェクトを使用して EmailAlertBusiness のフィールドに入力し、追加のキャプション フィールドとメソッドをビジネス オブジェクトに格納します。

于 2012-12-28T16:59:02.530 に答える