Spring, Hibernate and Lazy initialize?

Здравствуйте!

Возникает ошибка следующего рода, когда вывожу на контролере данные из бд.



org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: ua.home.entity.Question.answers, no session or session was closed




Сущность



@Entity<br>
    @Table(name = "Question")<br>
    public class Question implements Serializable{<br>
<br>
    @Id<br>
    @GeneratedValue(strategy=GenerationType.IDENTITY)<br>
    private int id;<br>
<br>
    private String question;<br>
<br>
    @OneToMany(mappedBy="question")<br>
    private List<Answer> answers;<br>
    .....<br>




DAO

@Repository<br>
@Transactional <br>
public class QuestionDAOImpl implements QuestionDAO {<br>
<br>
	@Autowired<br>
	private SessionFactory sessionFactory;<br>
	<br>
	@SuppressWarnings("unchecked")<br>
//	@Transactional<br>
	public List<Question> getQuestion() {<br>
		return sessionFactory.getCurrentSession().createQuery("from Question").list();<br>
	}<br>
}<br>




Service

@Service<br>
public class QuestionServiceImpl implements QuestionService {<br>
<br>
    @Autowired<br>
    private QuestionDAO questionDAO;<br>
<br>
    @Transactional<br>
    public List<Question> getQuestion() {<br>
        return questionDAO.getQuestion();<br>
    }<br>
}<br>




Conroller

@Controller<br>
public class QuestionController {<br>
<br>
    @Autowired<br>
    private QuestionService questionService;<br>
<br>
    @RequestMapping(value = "/", method = RequestMethod.GET)<br>
    public String home(Model model){<br>
        List<Question> qu =questionService.getQuestion();<br>
        System.out.println(qu);<br>
        return "home";<br>
    }<br>
}<br>




Пробовал использовать OpenSessionInViewFilter, с и без url-pattern



<filter><br>
        <filter-name>springSecurityFilterChain</filter-name><br>
        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class><br>
    </filter><br>
    <filter-mapping><br>
        <filter-name>springSecurityFilterChain</filter-name><br>
        <url-pattern>/*</url-pattern><br>
    </filter-mapping> <br>




Пробовал использовать EAGER, другая ошибка



org.springframework.web.util.NestedServletException: Handler processing failed; nested exception is java.lang.StackOverflowError




Нашел ещё совет использовать Hibernate.initialize, но не пойму как его точно сюда применить, если возможно в обще.



В data.xml добавил SessionFactoryUtils, тоже нашёл такой совет, не помогло.



<?xml  version="1.0" encoding="UTF-8"?><br>
<beans xmlns="http://www.springframework.org/schema/beans"<br>
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"<br>
    xmlns:context="http://www.springframework.org/schema/context"<br>
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:lang="http://www.springframework.org/schema/lang"<br>
    xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"<br>
    xmlns:util="http://www.springframework.org/schema/util"<br>
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd<br>
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd<br>
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd<br>
        http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd<br>
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd<br>
        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"><br>
<br>
    <tx:annotation-driven  transaction-manager="transactionManager" /><br>
<br>
    <bean id="transactionManager"<br>
        class="org.springframework.orm.hibernate3.HibernateTransactionManager"><br>
        <property name="sessionFactory" ref="sessionFactory" /><br>
    </bean><br>
<br>
    <bean id="messageSource"<br>
        class="org.springframework.context.support.ReloadableResourceBundleMessageSource"><br>
        <property name="basename" value="classpath:messages" /><br>
        <property name="defaultEncoding" value="UTF-8" /><br>
    </bean><br>
<br>
    <bean id="propertyConfigurer"<br>
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"<br>
        p:location="/WEB-INF/jdbc.properties" /><br>
<br>
    <bean id="dataSource"<br>
        class="org.springframework.jdbc.datasource.DriverManagerDataSource"<br>
        p:driverClassName="${jdbc.driverClassName}" <br>
        p:url="${jdbc.databaseurl}"<br>
        p:username="${jdbc.username}" <br>
        p:password="${jdbc.password}" /><br>
<br>
<bean name="hibernateSession" class="org.springframework.orm.hibernate3.SessionFactoryUtils" factory-method="getSession"<br>
  scope="prototype"><br>
        <constructor-arg index="0" ref="hibernateSessionFactory"/><br>
        <constructor-arg index="1" value="false"/><br>
        <aop:scoped-proxy/><br>
    </bean><br>
<br>
    <bean id="sessionFactory"<br>
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><br>
        <property name="dataSource" ref="dataSource" /><br>
        <property name="configLocation"><br>
            <value>classpath:hibernate.cfg.xml</value><br>
                <!-- <value>classpath*:**/hibernate.cfg.xml</value> --><br>
<br>
        </property><br>
        <property name="configurationClass"><br>
            <value>org.hibernate.cfg.AnnotationConfiguration</value><br>
        </property><br>
        <property name="hibernateProperties"><br>
            <props><br>
                <prop key="hibernate.show_sql">true</prop><br>
                <prop key="hibernate.dialect">${jdbc.dialect}</prop><br>
                <prop key="hibernate.connection.charSet">UTF-8</prop><br>
            </props><br>
        </property><br>
    </bean><br>
<br>
</beans><br>




Какие ещё могут быть решения моей проблемы или возможно где то допустил ошибку?



Спасибо



UPDATE



@Entity<br>
public class Answer  implements Serializable {<br>
	<br>
<br>
	@Id<br>
	@GeneratedValue(strategy=GenerationType.IDENTITY)<br>
//	@GeneratedValue<br>
	private int id;<br>
<br>
	private String answer;<br>
<br>
	private byte isCorrect;<br>
<br>
	@ManyToOne<br>
	@JoinColumn(name="QuestionID")<br>
	private Question question;<br>
.........<br>
       @Override<br>
	public String toString() {<br>
		return "Answer [id=" + id + ", answer=" + answer + ", isCorrect="<br>
				+ isCorrect + ", questions=" + question + "]";<br>
	}<br>


В общем если убрать строку + ", questions=" + question, тогда нету ошибки. Но в результате запроса нету FK на сущность Question.



toString Question



@Override<br>
	public String toString() {<br>
		return "Question [id=" + id + ", question=" + question + ", answers="<br>
				+ answers + "]";<br>
	}<br>




PS как автору ответить на комментарий пользователя? Раньше получалось, сейчас нету жму кажись.
  • Вопрос задан
  • 9669 просмотров
Решения вопроса 1
@MrD Автор вопроса
Проблема заключалось в том что я делал выборку из одной сущности которая была связан со второй, которая в свою очередь с первой. В результате получалась петля.

Первое решение которое было это убрать из Answer в методе toString answers="+ answers +.

Второй вариант делать запрос с использованием JOIN, правда у меня тут другая проблема с ним возникла, вместо значений возвращаются ссылки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Divers
@Divers
Если у вас Hibernate 4.16 + то добавьте в конфиг:
<prop key="hibernate.enable_lazy_load_no_trans">true <prop/>

Тогда хайбернейт сам будет открывать сессию.

hibernate.onjira.com/browse/HHH-7457
Ответ написан
javax
@javax
Software Architect, Java Developer since 1996
Lazy не работает, потому что сессия закрылась и обратится к БД за answers он уже не может.

Надо понять, почему не работает eager, посмотреть на стек ошибки
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Bell Integrator Ульяновск
До 400 000 ₽
Bell Integrator Ижевск
До 400 000 ₽
Bell Integrator Хабаровск
До 400 000 ₽
29 мар. 2024, в 16:38
5000 руб./за проект
29 мар. 2024, в 16:25
7000 руб./за проект
29 мар. 2024, в 16:22
30000 руб./за проект