2012-02-14 39 views
3

とのdataTableは、私は、Hibernate/JPAの世界で入力を取るのDataTableに対処するための正しい方法とは何か思ったんだけど。私が言うことができる限り、次の3つの選択肢のうちの1つがカード全体が崩壊する原因になっていますが、どちらが間違っているのか分かりません。始まりからそのデータをフェッチリクエストスコープの管理対象Beanを使用してのdataTable 統合氷/エース:JPAとリクエストスコープの豆

  • 内部の編集コンポーネントを置くすべての要求
  • の周りにトランザクションをコミットするカスタムJSFのPhaseListener経由取り扱い

    • 半自動トランザクションとのEntityManagerリクエスト・スコープのBeanとのdataTableの代わりに、[表示] - またはセッションスコープのBeanをバックアップリクエスト・スコープのEntityManager(要求にIDを設定するPrettyFacesからいくつかの助けを借りて、そのURLから豆をスコープ)

    私はan ICEfaces dataTable demo using JPAを参照していますが、トランザクションを手動で管理しており、デフォルトでは編集コンポーネントを表示していません。オブジェクトを編集可能にノミネートする行をクリックすると、「保存」を押すと手動で新しいEntityManagerにオブジェクトが再接続されてから、手動で保存が開始されます。 Click-to-edit機能は、現在のセッションに適切なオブジェクトが再接続されるようにするための手段を提供しています。

    新しいICEfaces 3.0エース:dataTable(néePrimeFaces 2.0 dataTable)についての印象は、それがViewまたはSessionスコープのBeanで使用されることですが、どのように表示されるのでしょうか要求AとEntityManager AでDAOから出てきたモデルオブジェクトがEntityManager Bで要求Bによって変更またはページされているモデルオブジェクトがある場合、StaleObjectStateやLazyInitializationExceptionsを回避することができます。

    Java EE私はTomcat 6から今のところ好きなものにアップグレードするという贅沢はありません(それは長期的には私の意図ですが)。また、SpringやSeamなど、他のクールなものを使い始めるつもりはありません。 ICEfacesは私たちのためには奇妙で、おそらくあまりにも奇妙なことです。

    これらを合計すると、どちらが間違っていますか?リクエストスコープのエンティティマネージャ、リクエストスコープのdataTable、またはdataTable内の編集コンポーネントを使用していますか?それとも本当にここに何か不具合がありますか?

  • 答えて

    4

    あなたは私に言わせれたい場合は、プライム障害は、要件が少し凝った何かを叫ぶように見えるとき、ほとんど裸のTomcatにこだわっているようです。マントラは、通常、あなたが「他のものすべて」を必要としないときにTomcatを使用しているので、必要なときに、なぜ裸のTomcatを使用し続けるのですか?

    しかし、パターンは本当に難しいことではありません。ビューのパラメータを持つ(IDSのようなパラメータがない場合)、または組み合わせてPreRenderViewEvent方法

  • 使用する別のサービスクラスを使用します -

    • は、Bean
    • @PostConstructで初期データを取得するバックビューをスコープがあります
        :エンティティマネージャEJB/CDI /春がなけれ
        • を「トランザクションがスコープ」作るデータ
        • を取得し、保存するエンティティマネージャ
        • 操作ごとにエンティティマネージャファクトリから新しいエンティティマネージャを取得します。
        • (リソースローカル)トランザクションを開始し、操作を実行し、トランザクションをコミットし、エンティティマネージャを閉じます。
    • 戻るあなたのバッキングBeanから直接エンティティのリスト、実体の対応するプロパティにテーブルの編集モード入力フィールドをバインドします。
    • 単一行を更新する場合は、対応するエンティティをサービスの更新メソッドに渡します。エンティティマネージャを取得するオーバーヘッドとは別に、トランザクションなどを開始すると、これは基本的にエンティティマネージャ上でmerge()を呼び出します。

    あなたがサービスしているサービスの外では、常にdetached entitiesと認識しています。したがって、LazyInitializationExceptionsのリスクはありません。バッキングBeanはビュー・スコープ内にある必要があります。そのため、JSFによって正しい(デタッチされた)エンティティが更新されます。これにより、独自のコードがサービスに渡され、永続コンテキストにマージされます。

    永続化するためのフローは、このようにある:サービスの作成

     
    View state    View scope  Transaction scoped PC 
    Facelet/components  Backing Bean  Service 
         Strings ------> Detached entities --> Attached entities 
    

    (データを取得するための流れを正確に逆である)

    この方法は、しかし少し退屈でマゾ運動の一種です。上の例のアプリと、上で説明した2つのメソッド(取得と更新)の場合はそれほど悪くはありませんが、かなりの大きさのアプリではすぐに使い果たされます。

    すでにTomcatにJSFとJPAを追加している場合は、TomEEのようなものを使用してください。これはTomcat(25MB vs 7MB)よりもやや大きめで、あなたが避けようとしているが現実には必要なものがすべて含まれています。

    Tomcatのインストールを絶対にアップグレードできない場合(たとえば、製品の所有者または管理者が開発者ではなくサーバーを所有していると思った場合など)は、CDIについて学習することができます。これはあなたの戦争(1つの余分な瓶)に簡単に追加することができますし、退屈なコードをたくさん抽象化しましょう。あなたが実際に使うことのできるものは、JTAプロバイダです。これもあなたの戦争とは別に追加することができますが、Tomya(またはGlassFish、Resin、JBossなどの代替)を使用するだけで、より多くのものを追加できます。あなたの詳細な回答のためCommunication in JSF 2.0

  • +0

    ありがとう:

    また、あなたの要件のさまざまな部分をカバーして、この記事を参照してください。私がドリュータを持っていれば、グラスフィッシュにアップグレードします。私はいくつかのアプリケーションを正常にロードするようにしましたが、TomEEの下で実際に動作するものは何も得ていません。私はあなたの状況の分析を完全に同意します。私はこの時点で私が望むことを組織に強制する贅沢はありません。それでも、私はあなたの助言を適用し、将来の道を見つけることができると思う。再度、感謝します! –

    +1

    @DanielLyons私たちの利益のために(私はTomEEで働いています)、あなたはdevee(at)openejb.apache.orgでTomEEに直面した問題の詳細を教えてください。私たちは若いサーバーであり、私たちが得るすべてのフィードバックが本当に必要です。 –

    +0

    詳細は今週末にお話します。私は、それがベータ版であることに起因していると思いました。 –

    関連する問題