У меня проблемы с спящим режимом в моем приложении 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
Спасибо, он частично решил проблемы. Я могу выполнять операции над объектами, используя 'getCurrentSession()'.Но есть еще одна проблема, я думаю, что она связана с несколькими открытыми сеансами. Посмотрите на обновление, пожалуйста. – misco
Это связано с неправильной настройкой транзакции. Уровень обслуживания должен быть уровнем транзакции, а не дао. Таким образом, в основном метод, который получает/модифицирует/обновляет, должен быть транзакционным. –
Это странно, потому что в контексте webapp есть набор , и каждая служба, вызывающая методы dao, имеет аннотацию @Service. –
misco