2012-04-22 12 views
1

現在、Java-EE6(GlassFish 3.1.2、MySQL Server 5.1、Netbeans 7.1.1)を使用した3層アプリケーションを開発中です。Java-EE6:階層間で@Entityを渡す方法を設計するには?

プロジェクトは現在、3つのプロジェクトで構成されています

  • エンタープライズアプリケーション/ EJBの:データベース
  • Javaクラス・ライブラリのエンティティを制御するために、ファサード:データベースモデル(このプロジェクトを表す@Entity注釈付きクラスサーバリソースのJNDIルックアップ(EJBのリモートアクセス)
:階層間のエンティティインスタンス)
  • J2SEファットクライアントを交換するために、EE-アプリと脂肪のクライアントによって共有されています

    エンティティの作成/変更/削除時にクライアントのGUIを更新するために、各クライアントが起動時にサブスクライブし、EJBコンテナ上のメッセージ駆動型Beanがパブリッシャとして機能するトピックを実装することによってJMSを使用することにしました。

    今、私は、次の大きな課題に直面:

    • を私は、サブスクライブしているクライアントに更新メッセージを発行する必要があり、エンティティオブジェクトへのライフサイクルリスナー(@PostUpdateなど)を添付しました。エンティティクラスはclass-libプロジェクトにありますが、パブリッシャはEE-appにあります。問題は、EE-appがclass-libプロジェクトを参照することですが、その逆もありません(循環プロジェクト参照は許可されないため)。したがって、エンティティクラスのライフサイクルコールバックメソッドには、EE-appのメッセージ駆動型パブリッシャBeanに関する参照がありません。

    これは、Java-EE6で3層アプリケーションを設計するのが基本的に正しいアプローチであるかどうかをより詳細にデザインする質問&ですか?

    私はできるだけ複雑さを低く抑えるために、可能な限りDTO/DAOを避けたいと思っています。アプリケーションは、大量のネットワークトラフィックを生成しません。

    事前にアドバイスをいただきありがとうございます。

  • 答えて

    0

    @Entityオブジェクトをすべてのレイヤーの間に直接渡して問題を解決しました。静的な製織(japana-linkをjpaプロバイダーとして使用)を有効にすることで、重い関係のために遅延フェッチを使用することができました。クライアント側から特定の重要な関係のみを取得するために、ロード・グループを使用して、エンティティ・マネージャからエンティティを切り離すネットワーク経由でシリアル化する前にプリフェッチする必要がある遅延関係を定義します。再びエンティティをサーバーに送信する場合は、サーバー側ファサードでEntityManager.merge(T)を使用して、エンティティを管理状態に戻します。非常に複雑なデータ階層であっても、この設計は問題なく動作します。

    +0

    EJBサーバーのコンテキストから@Entitiesをシッククライアントに送信することを意味しますか?これらのエンティティは、関係がプロキシであるため直列化できません。どのようにDTOなしでこの作業を行うことができますか? – edutesoy

    関連する問題