Java Can';t修复程序未能延迟初始化角色集合:无法初始化代理-无会话

Java 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

在jsp forEach调用和控制器类中,当我尝试访问类的延迟获取属性时,会得到org.hibernate.LazyInitializationException

我阅读了前面的所有答案并尝试了它们,我在我的服务和dao类方法中添加了@Transactional以确保使用它,我尝试了添加Hibernate.initialize(),没有起作用,后来又添加了一个过滤器,但这使我的性能比使用急切获取更差。当我将它更改为“急切获取”时,它会工作,但由于性能原因,我希望它是延迟获取的。 基本上,当在for循环行调用absoluteRatingVal()时会发生错误。文章和评级中的所有内容都是延迟获取

Article.java

@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) {
    }
}