5

ハイバネートについて質問です。

多対一の関係を持つ 2 つのオブジェクトがあります。

例: オブジェクト 1:

 public class Person {

 @Basic
 @Column(length = 50)
 protected String name;

 @NotFound(action=NotFoundAction.IGNORE)
 @ManyToOne(fetch = FetchType.EAGER)
 @JoinColumn(name = "groupCode", referencedColumnName = "code", updatable=false)
 protected Group group;

 ...all the getters and setters...
 }

オブジェクト 2:

 public class Group {
  @Id
  @Basic
  @Column(length = 3, nullable = false)
  protected String code;

  @Basic
  @Column(length = 30, nullable = false)
  protected String groupName;

   @Basic
   @Column(precision = 15, scale = 0)
   protected long exampleFieldId;

   ...rest of code....
  }

この例をできるだけ単純にするようにしました。私の問題は、Person の関連オブジェクト (グループ) が null になる可能性があることです。現在、Hibernate は特定の Person をロードすると Group のインスタンスをロードし、exampleFieldId を null に設定できないため (プリミティブ型であるため)、例外をスローします。

long を Long に変更することでこのエラーを止めることができますが、Person の Group オブジェクトは null である必要があり、そもそも Group オブジェクトが読み込まれないと考えていたでしょうか?

null が許可されているにもかかわらず、Hibernate が関連付けられたオブジェクトをロードするかどうか、または重要な注釈を見逃しているかどうかを知っている人はいますか?

ありがとう

4

2 に答える 2

5

フィロが述べたように:

NHibernateはそれを無効にするかどうかを決定するためにそれらをフェッチする必要があり、IDだけではそれを決定できないため、遅延読み込みを無効にして、fetchmnodeを参加に設定しましたか?

これは、NHibernateにあるにもかかわらず、発生している問題と同じようです。でもチェックする価値はあります!

Hibernateが「not-found=ignore」アソシエーションをロードしようとするのはなぜですか?

編集:それはあなたが行方不明である可能性があります@Fetch(FetchMode.JOIN)

于 2012-12-24T11:52:45.507 に答える
0

ここで何が起こっているのかを最終的に解決しましたが、問題は Hibernate にはありませんでした。

コードの奥深くに、null 文字列を空の文字列に変換する UserType がありました。つまり、groupCodeが実際には null になることはありません。したがって、Hibernate はロードする子オブジェクトがあると想定します。

groupCodeの上にアノテーション @Type(type="org.hibernate.type.StringType") を追加することで、この問題を回避できました。

興味深いことに、@NotFound(action=NotFoundAction.IGNORE) の使い方を誤解していました。

上記の問題を解決するために使用されると思っていましたが、実際には groupCode が設定されているが対応するグループがない場合の対処方法を定義しています。groupCode が null の場合の処理​​ではありません。

他の人もそれに陥るかもしれません。

于 2012-12-27T14:14:19.180 に答える