2013-12-04 6 views
0

У меня проблемы с спящим режимом в моем приложении Spring. Я думаю, что должна быть плохая конфигурация.Плохая конфигурация спящего режима для весеннего применения?

hibernate.cfg.xml

<hibernate-configuration> 
    <session-factory> 
     <property name="hibernate.bytecode.use_reflection_optimizer">false</property> 
     <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.password">password</property> 
     <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/cloud_app?autoReconnect=true</property> 
     <property name="hibernate.connection.username">root</property> 
     <property name="hibernate.connection.password">root</property> 
     <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> 
     <property name="hibernate.connection.release_mode">after_transaction</property> 
     <property name="show_sql">true</property> 

    ... 

persistanceContext.xml

<bean id="dataSource" destroy-method="close" 
     class="com.mchange.v2.c3p0.ComboPooledDataSource"> 
     <property name="driverClass" value="com.mysql.jdbc.Driver" /> 
     <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/cloud_app" /> 
     <property name="user" value="root" /> 
     <property name="password" value="root" /> 
     <property name="debugUnreturnedConnectionStackTraces" value="true" /> 
     <property name="unreturnedConnectionTimeout" value="20" /> 
     <property name="minPoolSize" value="5" /> 
     <property name="initialPoolSize" value="10" /> 
     <property name="maxPoolSize" value="50" /> 
     <property name="maxStatements" value="50" /> 
     <property name="idleConnectionTestPeriod" value="120" /> 
     <property name="maxIdleTime" value="1200" /> 
    </bean> 

    <!-- Hibernate --> 
    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <property name="configurationClass"> 
      <value>org.hibernate.cfg.AnnotationConfiguration</value> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.show_sql">true</prop> 
      </props> 
     </property> 
    </bean> 

    <!-- Transaction manager --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
     <property name="dataSource" ref="dataSource" /> 
    </bean> 

Когда я использую в моем приложении sessionFactory.getCurrentSession(), он по-прежнему бросает исключение

org.hibernate.LazyInitializationException: could not initialize proxy - no Session 

Но когда я использую sessionFactory.openSession(), он решает проблемы, но делает другие проблемы. Поэтому мой вопрос: как я могу достичь состояния - один сеанс для всего приложения. Как достичь этого, когда я позвоню sessionFactory.getCurrentSession(), сессия будет существовать. Я в замешательстве, я прочитал много тем, как их решить, но без успеха.

UPDATE Когда я получаю какой-то объект, а затем я пытаюсь изменить его

Opportunity opportunity = opportunityDao.get(idOpportunity); 
opportunity.setOrder(order); 
opportunityDao.edit(opportunity); 

код из get метод

public T get(Integer id) { 
    T object = (T) sessionFactory.getCurrentSession().get(clazz, id); 
    return object; 
} 

код из edit метода

public void edit(T object) { 
    this.sessionFactory.getCurrentSession().update(object); 
} 

Он бросает мне org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

ответ

1

Пара вещей

  1. Ваши hibernate.connection.* свойства бесполезны, как вы нагнетание DataSource внутри пружинного приложения
  2. других свойств для диалекта и show_sql уже установлен весной конфигурации, поэтому вкратце (из-за 1 и 2) вы можете удалить файл hibernate.cfg.xml.
  3. Используйте класс AnnotationSessionFactoryBean.

Оставляю тебя с этим

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.AnnotationSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.bytecode.use_reflection_optimize">false</prop> 
     </props> 
    </property> 
    <property name="packagesToScan" value="your.package.with.entities.here" /> 
</bean> 

Это по крайней мере, чистит вашу конфигурацию (и перемещение все в одном файле).

У вас возникли проблемы из-за неправильной конфигурации транзакций. У вас есть способ, HibernateTransactionManager, но не тот, когда/где он настроен. Я бы ожидал <tx:annotation-driven /> или <tx:advice /> с <aop:config /> для включения транзакций.

Я предлагаю прочитать transaction chapter в справочном руководстве по весне. Для получения дополнительной информации о спящем режиме читайте the hibernate section.

+0

Спасибо, он частично решил проблемы. Я могу выполнять операции над объектами, используя 'getCurrentSession()'.Но есть еще одна проблема, я думаю, что она связана с несколькими открытыми сеансами. Посмотрите на обновление, пожалуйста. – misco

+0

Это связано с неправильной настройкой транзакции. Уровень обслуживания должен быть уровнем транзакции, а не дао. Таким образом, в основном метод, который получает/модифицирует/обновляет, должен быть транзакционным. –

+0

Это странно, потому что в контексте webapp есть набор , и каждая служба, вызывающая методы dao, имеет аннотацию @Service. – misco

Смежные вопросы