現在、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 をトリガーして型をロードします。
属性がセッションから切り離されないのはなぜですか?