我正在尝试解决工作中的问题,该问题包含在生产和休息中多次调用的方法,这是界面的方法:
@Cacheable("CategoryDao.findAllLocale")
Set<Category> findAllLocale(String locale);
以下是实施:
public Set<Category> findAllLocale(final String locale) {
final Set<Category> localeCategories = this.findAllLocaleRootCategories(locale);
for (final Category rootCategory : localeCategories) {
final Set<Category> localeChildCategories = this.findAllLocaleByParent(locale, rootCategory.getCatId());
rootCategory.setCategories(localeChildCategories);
}
return localeCategories;
}
是一个简单的DAO方法,但问题是返回大量数据并且在服务器产生中抛出此异常:
01-01-15 10:09:47:984 - {ERROR} categories.GetAllCategoriesAction - User:5007660771072025 - Unexpected exception executing the action
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.company.app.data.Category.categories, no session or session was closed
at org.hibernate.collection.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:380)
我认为异常是关于@Cacheable重载的事情,因为应用程序运行了几个小时并且工作正常但随后崩溃并记录该片段,我想要制作一个&#34;大量的&#34;使用这个测试,所以我会知道那个或其他什么,任何建议?
PD:@Cacheable来自ehcache框架 PD2:对不起我的英文
答案 0 :(得分:0)
问题来自于让Hibernate / JPA实体逃脱,使它们比它们附加的会话更长寿。 因此,当您使用其中一个(来自缓存但它甚至可能不直接相关)并尝试访问延迟加载的集合时,问题会在稍后出现。最后一点失败是因为你已经超出了Hibernate / JPA会话的范围。
根据经验,您不应该缓存Hibernate / JPA实体。