使用: Hibernate 4.2.3、Eclipse Juno、および JSR286 ポートレット
理解できない例外動作が発生しています。ご意見やご提案をいただければ幸いです。
特定のデータベース テーブル (レガシー データを含む) を初めて使用するときは、外部キーの親レコードが存在するかどうかを確認する必要があります。存在しない場合は、ダミーの親レコードを挿入します。その後、すべてが機能します。親レコードをチェックし続けたくないので、ステートメントの周りに try/catch ブロックを配置しました。これによりObjectNotFoundException
、親がそこにない場合に発生します。親レコードが挿入されるとエラーが消えるため、親レコードが欠落しているとこの例外が発生することがわかっています。
私が助けを必要としている問題は、メソッドブロックを終了するまで例外がスローされず、必要な場所である try/catch ブロックによってキャッチされないことです。
public List<Folder> getFolders(Long folderId) {
String hql = "select folder from Folder folder where folder.folderId=:folderId order by folder.folderId";
Boolean valid = false;
List<Folder> folder = new ArrayList<Folder>();
while (!valid) {
try {
folder = (List<Folder>) sessionFactory
.getCurrentSession()
.createQuery(hql)
.setLong("folderId", folderId)
.list();
valid = true;
} catch (ObjectNotFoundException e) {
try {
sessionFactory
.getCurrentSession()
.createSQLQuery("INSERT INTO `folder` (`folderId`) VALUES (0);")
.executeUpdate();
logger.info("added parent record 0 to folder table");
} catch (Exception e1) {
logger.info(e1.getMessage());
}
}
}
return folder;
}
編集: これがスタック トレースです。ご覧のとおり、Hibernate が警告をスローし、次のエラーは、自分のコードではなく、Spring DispatcherPortlet から発生します。
2013-10-20 23:15:07,438 WARN [org.hibernate.engine.loading.internal.LoadContexts] - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@a5571f9<rs=com.mchange.v2.c3p0.impl.NewProxyResultSet@417e79d3>
2013-10-20 23:15:07,438 WARN [org.hibernate.engine.loading.internal.CollectionLoadContext] - HHH000160: On CollectionLoadContext#cleanup, localLoadingCollectionKeys contained [1] entries
2013-10-20 23:15:07,438 WARN [org.hibernate.engine.loading.internal.LoadContexts] - HHH000100: Fail-safe cleanup (collections) : org.hibernate.engine.loading.internal.CollectionLoadContext@6fad97bb<rs=com.mchange.v2.c3p0.impl.NewProxyResultSet@5d4fab2d>
2013-10-20 23:15:07,438 WARN [org.hibernate.engine.loading.internal.CollectionLoadContext] - HHH000160: On CollectionLoadContext#cleanup, localLoadingCollectionKeys contained [1] entries
2013-10-20 23:15:07,438 WARN [org.springframework.web.portlet.DispatcherPortlet] - Handler execution resulted in exception - forwarding to resolved error view
org.hibernate.ObjectNotFoundException: No row with the given identifier exists: [com.sbeko.slider.domain.Folder#10207]
at org.hibernate.internal.SessionFactoryImpl$1$1.handleEntityNotFound(SessionFactoryImpl.java:244)
at org.hibernate.event.internal.DefaultLoadEventListener.load(DefaultLoadEventListener.java:212)