11

Hibernate を使用してマッピングされたコンポーネントがあります。データベース内のコンポーネントのすべてのフィールドが null の場合、コンポーネント自体は hibernate によって null に設定されます。これは予想される動作であり、必要なものでもあります。

私が抱えている問題は、そのコンポーネントにバッグを追加すると、バッグが空のリストに初期化されることです。これは、コンポーネントにnull以外の値があることを意味します...その結果、コンポーネントが作成されます。

これを修正する方法はありますか?

<class name="foo.bar.Entity" table="Entity">
<id name="id" column="id">
    <generator class="native" />
</id>

<property name="departure" column="departure_time" />
<property name="arrival" column="arrival_time" />

<component name="statistics">
    <bag name="linkStatistics" lazy="false" cascade="all" >
        <key column="entity_id" not-null="true" />
        <one-to-many class="foo.bar.LinkStatistics" />
    </bag>

    <property name="loggedTime" column="logged_time" />

    ...
</component>

Restirctions.isNull("statistics") を使用した基準は、期待値を返します。

4

3 に答える 3

1

ここでの基本的な問題は、Hibernate が null コレクションと空のコレクションを区別できないため、両方を空 (非 null) として扱うことです。

代わりに、Statistics コンポーネントを実際のエンティティに変更することをお勧めします。次に、foo.bar.Entity クラスに null の可能性がある参照があります。統計エンティティを格納するために別のテーブルを作成する必要があるため、これは理想的ではありませんが、null と空のセマンティックの区別が必要な場合は、それを取得する方法です。

于 2011-08-16T19:54:45.723 に答える
0

これを確認することはできませんが、ここにアイデアがあります:

public void setListProperty(List list) {
  if (list == null || list.size() == 0) {
    this.listProperty = null;
  } else {
    this.listProperty = list;
  }
}

明らかに理想的ではありませんが、回避策になるかもしれません...

于 2011-07-06T19:35:39.383 に答える
0

多分これは役立つかもしれません.nullと空のバッグを区別する問題は解決しませんが、回避策です. ご存じかもしれませんが、エンティティの保存や更新などの特定のアクションをインターセプトできるインターセプターをセッションに導入できます。このインターセプターを使用してコンポーネントの状態を確認し、空の場合は再度 null にして、休止状態にならないようにすることができます。 t 空の値を保存します。 ここにドキュメントがあります。

于 2012-02-17T09:08:20.633 に答える