作業中のプロジェクトを Spring2+Hibernate3 から Spring3+Hibernate4 にアップグレードしています。HibernateTemplate と HibernateDAOSupport が廃止されたので、次のようにしました。
前(簡略化)
public List<Object> loadTable(final Class<?> cls)
{
Session s = getSession(); // was calling the old Spring getSession
Criteria c = s.createCriteria(cls);
List<Object> objects = c.list();
if (objects == null)
{
objects = new ArrayList<Object>();
}
closeSession(s);
return objects;
}
現在(簡略化)
@Transactional(propagation=Propagation.REQUIRED)
public List<Object> loadTable(final Class<?> cls)
{
Session s = sessionFactory.getCurrentSession();
Criteria c = s.createCriteria(cls);
List<Object> objects = c.list();
if (objects == null)
{
objects = new ArrayList<Object>();
}
return objects;
}
また、トランザクション アノテーション宣言を Spring XML に追加し、これを Hibernate プロパティから削除しました。
"hibernate.current_session_context_class", "org.hibernate.context.ThreadLocalSessionContext"
スタックトレースでこれを見ると、 @Transactional アノテーションが機能しているようです
at com.database.spring.DatabaseDAOImpl$$EnhancerByCGLIB$$7d20ef95.loadTable(<generated>)
初期化中、上記の変更は loadTable 関数へのいくつかの呼び出しで機能するように見えますが、親を持つエンティティをロードするようになると、「cascade="all-delete-orphan を持つコレクション」が参照されなくなりました" エラー。親または子を設定/取得する他のコードには触れておらず、DAOメソッドを修正しようとしているだけで、クエリはSQL SELECTのみを実行しているため、コードが壊れた理由を誰でも見ることができますか?