質問

誰かが答えを見つけるのを手伝ってくれることを願っています。

レガシーデータベースを使用していますが、他のアプリが既存のテーブルに依存しているため、既存のテーブルを変更できません。

既存の主要なテーブルが 3 つあります。 A、B、C.

A には B を参照する列があります (多対 1 の関係)。問題は、B ではなく C との関係を持たなければならないことです。そこで、*-1 マッピング BC を作成しました。

Tables: A,B,C,BC (all have ID field)
A-B many to one
B-C many to one through BC
Needed:A-C without altering A,B or C

B または BC の Java エンティティは必要ありません。A と C だけを必要とします。A にはフィールド A.c が必要です。

これまでのところ、@Formula アノテーションを使用しようとしましたが無駄でした。

class A{
  @ManyToOne
  @Formula(value="select BC.c from BC where BC.b = b")
  private C c;
}

これにより、次の SQL が生成されます。

select this_.c_ID from A this_

テーブル A には列 c_ID がないため、明らかに失敗します (式が完全に無視されるのはなぜですか?)。

@ManyToOne アノテーションを削除すると、以下が生成されます。

select (select BC.c from BC where BC.b = this_.b) as formula_0 from A this_

Hibernate が BINARY 値 (クラス C ? のシリアル化) を期待し、受け取った Integer をキャストするときに例外をスローすることを除けば、これは完璧です。

この ID は遅延読み込みには十分なはずですが、そのようにするにはどうすればよいでしょうか?@ManyToOne を使用すると、式が壊れます。

A、B、C テーブルを変更したり、Java クラス B または BC を作成したりせずに、A-C リンクを実現するにはどうすればよいですか?

情報をありがとう、 ダン

役に立ちましたか?

解決

サウンド使用して非常にこのバグのような、残念ながらありません修正準備注釈、あなたががそれらのクラスのXMLマッピングファイルでの作業それを得るかもしれないようです。

他のヒント

これは Hibernate 3.5.0-Beta-2+ で動作するはずです (HHH-4382 修正されました)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top