3

私は JSF に不慣れで、物事が正しいかどうか疑問に思っています。ページを作成できる単純な CMS があるとします。

まず、Page という JPA エンティティを定義します。

@Entity
public class Page {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  @Column
  private Long id;

  @Column private String title;

  @Column private String content;

  // getters & setters ...

}

次に、ビューで Page-s を作成したいと思います。そのためには、ある種のページ Bean が必要なようです。今のところ、次のようなことを処理しました。

@Model
public class PageBean {

  private Page page = new Page();

    public String getTitle() {
      return page.getTitle();
    }

    public void setTitle(String title) {
      page.setTitle(title);
    }

    // rest of properties & getters & setters ...

    public void save() {
      // persist using EntityManager
    }
 }

私の質問は次のとおりです。JPAエンティティモデルとビューで使用したいモデルがほとんどの場合まったく同じであることを考えると、 PageBean?

JPAエンティティおよびJSFモデルBeanと同じBeanを使用しないでください(JSFはJPAに影響を与える可能性のあるゲッターを繰り返し呼び出すため)をどこかで読みましたが、この種の回避に役立つより簡単な方法がないかどうか疑問に思いますコードの複製。特に、大規模なモデルを持つアプリケーションを持っていて、多くの場合、ビュー Bean に特別なものを必要としない場合、これは非常に面倒になる可能性があります。

4

2 に答える 2

4

[...] 私の JPA エンティティ モデルとビューで使用したいモデルがほとんどの場合まったく同じであるとすると、PageBean でゲッターとセッターのバッチを作成する必要を回避する方法はありますか?

エンティティの周りにラッパーを使用する意味がわかりません。そのようなレイヤーを追加すると、実際には重複します。JSF ページのエンティティを使用するだけです。はい、これはビューとドメインの間にある種の結合をもたらしますが、一般に、データベースを変更するということは、通常、ビューのフィールドを追加または削除することを意味します。言い換えれば、私は「デカップリング」の議論を買わず、可能な場合は単純なアプローチを支持するために十分な追加レイヤー、マッピング コード、ボイラープレート コードなどを書きました。

JPAエンティティおよびJSFモデルBeanと同じBeanを使用すべきではないことをどこかで読みました(JSFはJPAに影響を与える可能性のあるゲッターを繰り返し呼び出すため)

参照を提供できれば興味がありますが、どこかに問題がある場合、ラッパー クラス (エンティティへの呼び出しを委任する) は何も変更しません。

念のため、追加のリソースをいくつか示します。

于 2010-07-13T11:18:47.377 に答える
2

コードの重複ではありません。重複するアルゴリズムはありません。ビジネス ロジックはまだ 1 か所にあります。

Bean が行っていることは、View を Domain モデルに接続することだけです。これは良いことです。MVC パターンの一部です。

JPA エンティティーをバッキング Bean として使用していた場合、MVC パターンを破ることになります。たとえば、ある日プレーンを表示する代わりにこれStringに a を追加する必要がある場合、ビューが必要とするため (つまり、インターフェイス要件)、JPA クラス内にこのビュー ロジックを記述しますか? ドメイン モデルとビュー モデルを混在させるのは意味がありません。DateString

一方、なぜビューはドメインがどのように実装されているかを知る必要があるのでしょうか? ドメイン値の形式が変更された場合はどうなりますか? (たとえば、パフォーマンス上の理由から、日付クラスの代わりにタイムスタンプ文字列をデータベースに保存します)。必要なのは、バッキング Bean のメソッドを書き直すだけです。タイムスタンプを取得してそれを Date に適合させ、すべてが以前と同じように機能するようにします。JPA クラスの外側で 1 つだけ変更します。JPA クラスにある場合は、両方のロジックを 1 つのクラス (インターフェイス ロジックとドメイン ロジック) で維持することになります。

新しいビューを開発したい場合 (モバイル バージョンなど) はどうすればよいですか? JPA クラスにさらにコードを追加しますか? JPA はそのままにして、別の Bean (両方のビューに共通の Bean を拡張する) をモバイル バージョン用に作成する方がよいでしょう。

それでもゲッターとセッターを書きたくない場合は、次のようにします。

#{myBean.page.title}

必要なのはgetPage()、バッキング Bean の内側だけです。

于 2010-07-13T09:38:32.747 に答える