0

私はまだ JPA に完全に慣れている段階ではありません。

現在、関係アノテーションを使用するか、クエリで必要なときに関連オブジェクトを取得するかで悩んでいます。

たとえば、プロジェクトを所有するユーザーがいます。一対多の関係を使用してオブジェクト形式でプロジェクトを取得するか、必要なときにユーザーのプロジェクトを照会するだけです。

後者のソリューションにはより多くのコードが含まれますが、どういうわけか、やりたいことをより自由に制御できます。または、少なくともそれが私の印象です。前者は、オブジェクトの作成/削除/更新など、かなりの量の定型コードを処理することは明らかですが、途中で学ぶべきトリックがかなりあります。

JPA でリレーションシップ アノテーションをいつ使用するかについて、できれば彼女/彼の経験に基づいて、誰かが簡単な経験則を思いつくことができれば、非常にありがたいです。

ありがとう、

トーマス

4

5 に答える 5

2

基本的なルールは、必要なときに関係を作成する必要があるということです。

1対1および多対1の関係の場合、それは非常に簡単です。ほとんどの場合、それらが必要です。たとえば、Project情報を表示する場合、ほとんどの場合、所有者情報も表示する必要があるため、ここでは関係を作成することをお勧めします。

1対多および多対多の関係では、それらを使いすぎるとパフォーマンスの問題が発生する可能性があるため、より注意が必要です。

私の個人的な経験則は次のとおりです。ページネーションやフィルタリングを行わずに一度にすべてを表示する必要がない場合ProjectUserまたは少なくとも頻繁に表示する必要がない場合)は、関係を作成しないでください。それ以外の場合は作成できます(たとえば、通常は一度にすべてOrderLineのがOrder必要になるため、この場合は1対多の関係が必要です)。

于 2012-04-09T09:53:44.847 に答える
1

あなたの問題は有効であり、JPA準拠のORMでは関係が困難です。ただし、リレーションシップの利点は、JPAQLクエリでリレーションシップを使用できることです。たとえば、特定の名前でユーザーが作成したすべてのプロジェクトを取得する場合は、次のように記述できます。

SELECT p
FROM Project p
WHERE p.user.name = 'Smith'

次の場合の代わりにこれを行うことはできません。

@ManyToOne
private User user

関係ではProjectあなたは単純です:

private int userId;

また、さまざまなフェッチ戦略を調査して、関係をより快適に感じてください。

于 2012-04-09T09:42:47.453 に答える
0

それはすべて、アプリケーションがデータとそれを必要とするインスタンスの取得に関してどのように動作するかに依存します。JPA はどこでも使用できますが、Java EE コンテナーの外部であっても使用できます (これは、標準の Java SE アプリや Spring などで使用する大きな利点です)。応答スタイルの対話、Web アプリケーションへのマッピングなど (公平を期すために、これらは最近最も人気のあるタイプのエンタープライズ サーバー側アプリケーションです)。ただし、非常に具体的なニーズがない限り、JPA 関係アノテーションの学習に間違いなく投資します。

JPA では、すべてが EntityManager セッションを経由します。ワークフロー全体でエンティティを管理する EntityManager インスタンスがある場合、ユーザー、プロジェクトなどを取得する必要がある場所に言及している場合、すべて 1 つの要求応答内で、@OneToMany などを使用することをお勧めします。外部キーを結合する方法を気にせずに必要なときにいつでもエンティティを取得し、いつ何を取得するかについて最適化を行います。リクエスト間で同じエンティティを保持する必要がある場合でも、refresh()merge( ) を使用すると非常に簡単です。

FetchType、CascadeType などで注釈が少し複雑になる傾向があることに同意します。また、複数のバッグを同時に取得できないという悪名高いPersistenceException に直面することもあります。投資する価値があります。

于 2012-04-09T09:44:36.563 に答える
0

2 つのエンティティ間に関係があり、それを使用する予定がある場合は、JPA 関係アノテーションを使用します。主な利点の 1 つは、エンティティ間に関係がある場合に手動で追加のクエリを作成する必要がないことです。

于 2012-04-09T09:25:55.323 に答える
0

私は注釈に行きます。シンプルで生成されるコードが少なく、JPA を使用することの要点のようなものです。また、1 対多のセットはデフォルトで遅延フェッチされるため、データベースから不要なものをフェッチするリスクはありません。

しかし、レイジー/イーガー フェッチについて読んで、その仕組みを学ぶことをお勧めします。

于 2012-04-09T09:26:13.317 に答える