Java Can';t修复程序未能延迟初始化角色集合:无法初始化代理-无会话
在jsp forEach调用和控制器类中,当我尝试访问类的延迟获取属性时,会得到org.hibernate.LazyInitializationException 我阅读了前面的所有答案并尝试了它们,我在我的服务和dao类方法中添加了@Transactional以确保使用它,我尝试了添加Hibernate.initialize(),没有起作用,后来又添加了一个过滤器,但这使我的性能比使用急切获取更差。当我将它更改为“急切获取”时,它会工作,但由于性能原因,我希望它是延迟获取的。 基本上,当在for循环行调用absoluteRatingVal()时会发生错误。文章和评级中的所有内容都是延迟获取 Article.javaJava Can';t修复程序未能延迟初始化角色集合:无法初始化代理-无会话,java,spring,hibernate,spring-mvc,lazy-initialization,Java,Spring,Hibernate,Spring Mvc,Lazy Initialization,在jsp forEach调用和控制器类中,当我尝试访问类的延迟获取属性时,会得到org.hibernate.LazyInitializationException 我阅读了前面的所有答案并尝试了它们,我在我的服务和dao类方法中添加了@Transactional以确保使用它,我尝试了添加Hibernate.initialize(),没有起作用,后来又添加了一个过滤器,但这使我的性能比使用急切获取更差。当我将它更改为“急切获取”时,它会工作,但由于性能原因,我希望它是延迟获取的。 基本上,当在fo
@Entity
@Table(name = "articles")
public class Article {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "title")
private String title;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "created_by")
private User user;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "article", fetch = FetchType.LAZY)
private Set<Rating> rating = new HashSet<>();
public Double getAbsoluteRatingVal() {
double rating = 0;
Set<Rating> ratings = getRating();
for (Rating r : ratings) {
if (Days.daysBetween(new DateTime(r.getDate().getTime()), new DateTime(new Date().getTime()))
.getDays() < 301)
if (r.getGenuine() != null)
rating++;
else if (r.getOpinion() != null)
rating++;
}
if (ratings.size() > 0)
return rating;
return null;
}
}
编辑
在featured.jsp中,我得到了以下错误:org.hibernate.lazyiInitializationException:无法初始化代理-调用article.user.isSubscribed()时没有会话,该函数访问OneToOne关系,据我所知,该用户为null,因为无法获取
featured.jsp
<c:choose>
<c:when
test='${article.user.isSubscribed() and article.user.subscription.type eq "silver" }'>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span
class="silvername"> <c:out value="${article.user.name}"></c:out></span></a>
</c:when>
<c:when
test='${article.user.isSubscribed() and article.user.subscription.type eq "gold" }'>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span
class="goldname"> <c:out value="${article.user.name}"></c:out></span></a>
</c:when>
<c:when
test='${article.user.isSubscribed() and article.user.subscription.type eq "premium" }'>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span
class="premiumname"> <c:out
value="${article.user.name}"></c:out></span></a>
</c:when>
<c:otherwise>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span>
<c:out value="${article.user.name}"></c:out>
</span></a>
</c:otherwise>
</c:choose>
我希望应用程序在从NewsDao\searchArticlesByRating(String)
返回之前,即调用Article\getAbsolutetingval()
之后,立即使用lazy fetch运行
@Transactional(...)
public List<Article> searchArticlesByRating(String query) {
Session session = session();
try {
// business logic here
session.close();
return result;
} catch (Exception e) {
}
}
事务性(…)
公共列表搜索ArticlesByRating(字符串查询){
会话=会话();
试一试{
//这里的业务逻辑
session.close();
返回结果;
}捕获(例外e){
}
}
非常感谢Mahmud,它解决了这个问题,但出现了另一个相同的异常,这次是在我的jsp中。我正在添加一个编辑来解释新错误。@DisplayName新问题是什么?如果这与视图层的问题相同,请参阅此
OpenSessionInViewInterceptor
[我为OpenSessionInViewInterceptor添加了@Bean,但我找不到使用addInterceptors的方法(InterceptorRegistry)或者以任何其他方式使其执行。您知道解决方案吗?提前谢谢。@DisplayName恐怕我必须查看详细代码。如果有帮助,您可以发布另一个问题!如果它解决了您所问的特定问题,也可以随意接受此ans!谢谢!
<c:choose>
<c:when
test='${article.user.isSubscribed() and article.user.subscription.type eq "silver" }'>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span
class="silvername"> <c:out value="${article.user.name}"></c:out></span></a>
</c:when>
<c:when
test='${article.user.isSubscribed() and article.user.subscription.type eq "gold" }'>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span
class="goldname"> <c:out value="${article.user.name}"></c:out></span></a>
</c:when>
<c:when
test='${article.user.isSubscribed() and article.user.subscription.type eq "premium" }'>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span
class="premiumname"> <c:out
value="${article.user.name}"></c:out></span></a>
</c:when>
<c:otherwise>
<a class="bold"
href='${pageContext.request.contextPath}/u/${article.user.username}'><span>
<c:out value="${article.user.name}"></c:out>
</span></a>
</c:otherwise>
</c:choose>
@Transactional(...)
public List<Article> searchArticlesByRating(String query) {
Session session = session();
try {
// business logic here
session.close();
return result;
} catch (Exception e) {
}
}