3

[編集: どうやら、これは配列のみの問題であり、FoxyBOA の回答はその回答につながる可能性があります (またはそうでさえあります)。

私の質問は、Hibernate3+Annotation、Spring MVC、MySQL、およびこの例では Spring Security のソフトウェアに関するものです。

Hibernate によって自動的に関連付けられるコレクションに、(正しい要素以外に) 子テーブルの各行番号に null 値が含まれているのはなぜだろうと思っていました。私の例:

ユーザー権限テーブルがあり、ユーザーテーブルの主キーは、外部キーとして機能するユーザー名です。現在、権限テーブルには 13 行あります。データベース (MySQL InnoDB) からユーザーを取得すると、Hibernate はこのマッピングに対応するユーザーの権限を自動的に取得します。

@OneToMany
@JoinColumn(name = "username")
@IndexColumn(name="id") // "id" was the primary key and is used to sort the elements
public Authority[] getAuthorities() {
    return authorities;
}
public void setAuthorities(Authority[] authorities) {
    this.authorities = authorities;
}

... 14 (0-13) の要素を含むコレクション "authorities" になり、そのうちの 4 つだけが null ではありません (データベース テーブルの 4 つの行はその特定のユーザーに属しているため、正しいです)。私が認識する限り、Fetchmode などのプロパティに Hibernate のデフォルトを使用しています。次のようなユーザーを取得しています。

Criteria criteria = getSession().createCriteria(User.class);
criteria.add(Restrictions.eq("username",username));
User user = (User) criteria.uniqueResult();

org.hibernate.loader.loader からのログ情報は、結果セットの 4 つの行を正しく「言及」します。それでも、作成されたユーザーには、配列内に 4 つの正しい要素と 10 個の null 値があります。私の特定の例では、これにより次の例外が発生します。

java.lang.IllegalArgumentException: Granted authority element 0 is null - GrantedAuthority[] cannot contain any null elements
4

2 に答える 2

3

答えは @IndexColumn アノテーションにあります。id の値を配列インデックスとして使用しているため、配列内の要素の数は、基本的に Authorities テーブル内の最大の ID の値になります。

インデックス付きコレクションに関する休止状態のドキュメントを参照してください

注釈を削除してみてください。

また、考えとして。マッピングに Set を使用することを検討しましたか? 厳密に必要というわけではありません。もう少し一般的なマッピング形式です。それだけです。

于 2009-05-26T19:01:24.567 に答える
2

データを確認することをお勧めします。インデックスが欠落している場合(この場合はid列)、idが欠落している代わりに、配列でnullが発生します。つまり

table authorities:
username id
bob 1
bob 3
bob 5

その結果、配列が作成されます:{0 = null、1 = bob、2 = null、3 = bob、4 = null、5 = bob}

更新: 私は2つのケースで状況に遭遇しました:

  1. Authorityテーブルのインデックス付き列IDにキー値がありません(例:0、1、3、4、5-値2がありません。Hibernateはキー2と値がnullの配列値に自動的に追加します)。
  2. インデックス付きの値は順番に並んでいますが、それらの一部をフィルタリングする基準を選択します(たとえば、「from user u join u.authorities a where a.id = 2」に似たHQL。この場合、休止状態でユーザーをロードしますが、機関では配列を指定します。値は3つだけになります:0-null、1-null、2-IDを持つ権限2)。
于 2009-05-26T17:08:25.670 に答える