2011-07-14 7 views
2

私はEJB 3.1とJPA 2.0を使用しています。EJBとJPAの設計に関する質問

私は疑問を説明し、良い練習とは何か、何がないのかをヒントとして尋ねます。

私はユーザーファサードであるEJBを持っているとしましょう。ですから、このようなものがあります:

@Stateless 
public class UserRepository { 

    public User find(Long id) { 
    ...do user lookup using entitymanager. 
    } 

} 

よしが、今の私はこれからUserエンティティを返すと言わせ、このエンティティは、コメントのコレクション(コメントも実体であることを)持っていること。

私はfindCommentsByUser(Long userId)メソッドを持つコメントリポジトリを持っている可能性があります。または、ユーザーを取得してgetComments()メソッドを呼び出すことができます。このケースはシンプルかもしれませんが、私はこの決定に何度も直面しています。

また、コメントを追加したい場合、エンティティが持つコメントコレクションにエンティティを追加し、エンティティをマージするか、addComment(Long userId, Comment newComment)メソッドを追加する必要がありますか?

私はこれに関するアドバイスやベストプラクティスを探しています。さらに詳しい説明が必要な場合は、お気軽にお問い合わせください。

EDIT:

私が参考にこれまでのコメントを見つけたが、これに気づく、それはユーザーとコメントについては、実際にはありませんが、私はちょうど私の状況を説明することを作りました。両方のアプローチを混在させるのが便利かどうか(私はそうではないと思う)か、もう一方のアプローチよりも優れているかどうかについてです。私は「常にリポジトリを通じて持続する」という提案を好きでした。しかし、私がfetchComments()リポジトリメソッドとgetComments()をユーザーエンティティに持つという事実は、同じ機能のエントリポイントを作成するので、どうすれば対処できますか。 また、パフォーマンス(1クエリ対2クエリ)も重要ではありません。なぜなら、ユーザーエンティティもフェッチしているので、実際には何も保存していないからです。

答えて

1

通常、ユーザーオブジェクトにgetComments()メソッドを追加します。追加する場合は、それをユーザーセットに追加し、ユーザーオブジェクトに対してupdateを呼び出します。

1

これは、プロセスのきめ細かな制御(これは多くの場合、パフォーマンス要件と予想される負荷などに依存します)の要件に大きく依存すると思います。 コメントを決して個別に取り出すことができない場合は、User内の参照として保持するだけです。

ただし、ユーザーに関係なくコメントを取得する場合や、他のコメント関連のクエリ(グループAのユーザーのすべてのコメントなど)を実行する場合は、別のCommentsRepositoryを作成します。

DBから読み込まれていないユーザーにコメントを追加できますが、外部キーを持っている場合は、提案したようにCommentsRepositoryからコメントを追加するだけです並行してユーザーのコメントのリストを作成し、そのような2つのリストをDBに保存すると、「奇妙な動作」が発生する可能性があります)。

3

通常、アプリケーションでは分離されたエンティティのみで動作するため、エンティティを取得および更新するデータアクセスマネージャがあります。それから私たちはビジネスロジックで行うことは、具体的に呼び出されない限り、永続化されないことを知っています。また、ユーザーエンティティでコメントを取得しますが、明示的に呼び出されるまで永続化されないようにしてください。

2

私はfindCommentsByUser(ロング USERID)メソッドでコメントリポジトリを持つことができ、または私は、ユーザーを取得し、(getCommentsを呼び出すことができます)

私はパフォーマンスポイントからのことを言います最初の選択肢は、ユーザー(1つのクエリ)とコメント(別のクエリ)をフェッチしないので、わずかに優れています。最初は1回のショットでそれを行います。反対側には

、私は、第二は、より抽象的な読める、とオブジェクト指向アプローチを見つけます。私はこれを使用します。

1

いくつかの考慮事項がありますので、ここでそれらを文書化してください。

  1. ドメインモデルはEJB3では重要な考慮事項です。あなたの例では、あなたのドメインモデルを見れば、どんな流れでもユーザーの詳細を最初に表示し、コメントを表示するので、コメントを遅らせることができます。
  2. あなたのコレクション(ここでのコメントを参照しています)には多くのデータが含まれていることがあります。この場合、文字列データの問題はほとんどありませんが、大きな問題ではありませんが、それらを独立して取得するための適切なメソッドを提供します。
  3. エンティティBean内でコレクションを外部に公開することは決して良いことではありません。OneToManyまたはManyToMany関係の場合は、コレクションに対して3つの基本メソッド(add、remove、get)を提供する必要があります。
  4. getメソッドからコレクションを返すときにCollections.unmodifiableCollectionメソッドを使用する必要があります。
  5. 常にエンティティ内のコレクションを使用している場合は、重複を許可していないことを覚えておいてください。
  6. あなたのケースでは、コメントコレクションはユーザーに直接依存しているので、ユーザーはカスケードタイプを使用してコメントを保存する必要があります。
  7. em.findメソッドがあなたのために仕事をするため、私はUserRepositoryが必要な理由を確信していません。
  8. デフォルトでは、OneToManyリレーションfetchtypeは遅延型です。熱心な負荷を加えたい場合は、指定する必要があります。

私はこれらのガイドラインがあなたの問題を解決することを願っています。

よろしくお願いいたします。 Amit

関連する問題