gpt4 book ai didi

java - 延迟的 ObjectNotFoundException

转载 作者:行者123 更新时间:2023-12-01 13:58:38 26 4
gpt4 key购买 nike

使用:Hibernate 4.2.3、Eclipse Juno 和 JSR286 portlet

我遇到了我不理解的异常行为,任何想法或建议将不胜感激。

第一次使用特定的数据库表(具有遗留数据)时,我需要检查外键父记录是否存在,如果不存在,那么我想插入一个虚拟父记录,之后一切会起作用 - 我不想继续检查父记录,因此我在语句周围放置了一个 try/catch block ,如果父记录不存在,这将导致 ObjectNotFoundException 。我知道缺少父记录会导致此异常,因为插入父记录后错误就会消失。

我需要帮助解决的问题是,直到退出方法 block 之后才抛出异常,并且它不会被 try/catch block 捕获,而这正是我需要它的地方。

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,而不是来 self 自己的任何代码。

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)

最佳答案

来自 Hibernate ObjectNotFoundException javadoc:

Thrown when Session.load() fails to select a row with the given primary key (identifier value). This exception might not be thrown when load() is called, even if there was no row on the database, because load() returns a proxy if possible. Applications should use Session.get() to test if a row exists in the database.

因此有两件事需要检查:是否有延迟实例化,因此正在获取代理而不是真实对象,并在实际使用真实对象时获取异常,以及是否使用 session.get()可以解决您的问题,甚至可以更好地实现您的目的。

<小时/>

编辑以处理进一步的问题:

another SO question 中找到此内容,使用HQL:

public Boolean exists (DTOAny instance) 
{
Query query = getSession().
createQuery("select 1 from DTOAny t where t.key = :key");
query.setString("key", instance.getKey() );
return (query.uniqueResult() != null);
}

您可以将 instance.getKey() 替换为获取您要查找的实例的 ID 所需的任何内容。

此外,如果您要使用您提到的 get() 方法,我认为它需要实际的索引 ID,而不是 0。祝您好运。

关于java - 延迟的 ObjectNotFoundException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19483482/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com