Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Настройка Hibernate через Spring


Автор: XEugene 13.2.2009, 13:02
Настраиваю Hibernate средствами Spring.

При запуске теста для DAO-бина получаю иксепшен:
Код

Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed


Хотя открытие сессии должен обеспечивать сконфигурированный SessionFactory.
Вот конфиг spring-hibernate.xml, в котором все настраивается
Код

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
    "http://www.springframework.org/dtd/spring-beans.dtd">

<beans>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@//one.ios.icl:1521/orcl"/>
        <property name="username" value="username"/>
        <property name="password" value="password"/>
    </bean>

    <bean id="mySessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="mappingResources">
            <list>
                <value>ru/sdf/model/templateDao.hbm.xml</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <value>hibernate.dialect=org.hibernate.dialect.OracleDialect</value>
        </property>
    </bean>

    <bean id="hibernateTemplate"
            class="org.springframework.orm.hibernate3.HibernateTemplate">
        <property name="sessionFactory">
            <ref bean="mySessionFactory"/>
        </property>
    </bean>


    <bean id="templateDao" class="ru.sdf.model.hibernate.TemplateDao">
        <property name="hibernateTemplate">
            <ref bean="hibernateTemplate"/>
        </property>
    </bean>

</beans>


Код теста
Код

public class Test {

        public static void main(String[] args) {

        Resource resource = new FileSystemResource(
            "./src/resources/spring-hibernate.xml");
        BeanFactory factory = new XmlBeanFactory(resource);

        Template template = new Template ();
        template.setTemplateName("name");

        TemplateDao templateDao = (TemplateDao) factory.getBean(
            "templateDao");
        templateDao.saveOrUpdate(template);

    }
}


TemplateDAO.java
Код

public class TemplateDAO {

    private HibernateTemplate hibernateTemplate;

    public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
        this.hibernateTemplate = hibernateTemplate;
    }

    public HibernateTemplate getHibernateTemplate() {
        return hibernateTemplate;
    }

    public Template getTemplate(final String id){
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session)
                throws HibernateException,SQLException {
                return session.load(Template.class, id);
            }
        };
        return (Template) hibernateTemplate.execute(callback);
    }


    public void saveOrUpdate(final Template template){
        HibernateCallback callback = new HibernateCallback() {
            public Object doInHibernate(Session session)
                throws HibernateException,SQLException {
                session.saveOrUpdate(template);
                return null;
            }
        };
        hibernateTemplate.execute(callback);
    }
}


Источник информации - http://www.javabeat.net/articles/42-integrating-spring-framework-with-hibernate-orm-framewo-3.htmlстатья.

Автор: AntonSaburov 13.2.2009, 13:50
У тебя сообщение говорит о том, что сессия для Hibernate уже закрылась. Т.е. объект как бы уже "оторван" от базы (от сессии). У него с ней связи нет. 
Думаю, что объект имеет коллекцию/связь в другими объектами. Т.к. коллекция lazy, то она будет загужаться только тогда, когда это действительно потребуется. И видимо это требуется уже после "отрыва" объекта то сессии.

Автор: XEugene 13.2.2009, 14:10
Класс Template пока единственный в моей модели,  поэтому связей у него нет.  Хотя ошибка вроде действительно говорит о том, что сессия закрылась.  Только вот где и когда она была открыта...



Автор: XEugene 15.2.2009, 00:13
Проделал всё то же самое дома - работает.
Но сейчас я использовал org.springframework.jdbc.datasource.DriverManagerDataSource вместо org.apache.commons.dbcp.BasicDataSource, поскольку мне было лень собирать все необходимые для BasicDataSource либы.

Так что возможно проблема была как раз в них. Правда,  датасорс у меня всё же создавался и SessionFactory тоже...

Добавлено через 11 минут и 24 секунды
А может лучше использовать JNDI - датасорс,  предоставляемый томкатом?

Добавлено через 13 минут и 54 секунды
То есть org.springframework.jndi.JndiObjectFactoryBean.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)