0

現在、Hibernates デタッチ オブジェクトを DTO として使用するテストを行っています。しかし、親 Bean のデタッチが、親 Bean のコレクション内に含まれる Bean にカスケードされないという問題があります (CascadeType.ALL が設定されています)。

たとえば、属性タイプへの外部キーを持つ属性のコレクションを含む親があります。私は次のように読みました。

Parent bean = (Parent) session.createCriteria(Parent.class)
    .add(Restrictions.eq("id", 1223215031850009727l))
    .setFetchMode("attributes", FetchMode.JOIN)
    .createAlias("attributes.type", "attributetype")
    .uniqueResult();

Bean を読み取った後、セッションから切り離します。

session.evict(bean);

その後、私はいくつかのデータを出力します:

System.out.println(bean.getName());
for (Attribute attr : bean.getAttributes()) {
    System.out.println(attr.getName());
    System.out.println(attr.getType().getName());
}

これまでのところ、すべてが期待どおりに機能しています。しかし、Bean のロードから「createAlias」を削除すると、セッションから切り離される必要があるため、属性タイプのアクセスでエラーが発生することが予想されます (属性マッピングには CascadeType.ALL が含まれます)。エラーの代わりに、hibernate は SQL をトリガーして型をロードします。

属性がセッションから切り離されないのはなぜですか?

4

1 に答える 1

0

解決策を見つけました。カスケード (少なくとも DETACH) も外部キー プロパティに設定する必要があります。

于 2013-01-19T14:52:47.167 に答える