1

2 つのエンティティがあり、それらの間に多対 1 の関係があります。多くの B エンティティは A エンティティに関連しています。私の B テーブルにはA_ID列があります。状況によっては、A のどの行にも関連付けられていない B エンティティがある場合がありA_IDます。これは理想的ではないことはわかっていますが、古いシステムの一部であり、コードのこの部分に実際に触れることはできません。 .

setA()適切な Hibernate エンティティを使用すると、B のメソッドと B のメソッドを使用して関連付ける A エンティティがあるときに、B エンティティを追加できgetAs().add()ます。A エンティティに関連付けられていない B エンティティを追加したい場合に対処する方法がわかりません (A_ID = 10たとえば、 B's で A が存在しない場合ID = 10)。これは可能ですか、それともこの時点でエンティティ階層を壊して手動で処理するのに行き詰まっていますか?

setAId()B エンティティに a を追加し、それまたはsetA()メソッドのいずれかを使用するが、両方を使用しない方法はありますか? Hibernate はこれを許可しますか? B にゲッターとセッターを追加しようとすると、次のエラーが発生します。

MyHibernateException: Hibernate SessionFactory creation failed, hibernateCfgFileNm=hibernate.xml
...
Caused by: org.hibernate.MappingException: Repeated column in mapping for entity: test.B column: A_ID (should be mapped with insert="false" update="false")

コードを提供していないことをお詫び申し上げます。この説明で十分だと思いますが、コードが必要な場合は追加できます。

4

1 に答える 1

1

エンティティ関係についての私の理解 (これらを標準の JPA @ManyToOne/@OneToMany関係でマッピングしていると思いますか?) で、ここでいくつかの楽しい問題に遭遇すると思います。

シーケンスで生成された ID を使用して A エンティティを作成し、古いシステムから A_ID を運ぶだけの「プレースホルダー」A エンティティを許可します。すべての A エンティティが完全なエンティティであるとは限らないことをコードに認識させ (上記の A_ID をプレースホールドするだけでよい)、適切に処理することで、従来のシステムから切り離された ID を使用して、常に A エンティティを提供できるようになります。 .

リレーションを同じ列にマップし、リレーションが問題を引き起こすことなく列に値を設定することはできないと思います-おそらくリレーションをLAZYフェッチとしてマークし、発生するはずの例外をキャッチしない限り存在しないエンティティ A を解決しようとするとき。これも機能する可能性があります。その場合は、関係列を読み取り専用 ( insert="false" update="false") としてマップし、すべてをsetAId(id). setA(A)コレクションを読み取ると、その性質上、関連するすべての行がフェッチされるため、管理されたコレクションではなく ID に対してのみメソッドを操作する必要がある場合があります。

従来の ID のセマンティクスが大まかに「ここでは、この ID は null オブジェクトである可能性があります」と解釈される場合は、従来のシステムの ID から分離することをお勧めします。

于 2013-05-15T20:46:52.420 に答える