2014-12-02 3 views
1

Я использую Spring 3.2 mvc и Hibernate 4 в моем проекте.Спящий режим не работает

hibernate.cfg.xml

<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
<property name="hibernate.connection.autocommit">true</property> 
<property name="show_sql">true</property> 
    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 
    <property name="hibernate.validator.apply_to_ddl">false</property> 
    <property name="hibernate.validator.autoregister_listeners">false</property> 

сервлет-context.xml

<beans:beans xmlns="http://www.springframework.org/schema/mvc" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:beans="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:security="http://www.springframework.org/schema/security" 
     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
       http://www.springframework.org/schema/security 
       http://www.springframework.org/schema/security/spring-security-3.2.xsd 
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 



     <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure --> 
     <security:global-method-security pre-post-annotations="enabled"/> 
     <!-- Enables the Spring MVC @Controller programming model --> 
     <annotation-driven /> 
     <context:annotation-config /> 
     <context:component-scan base-package="com.abc" /> 

     <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
       <beans:property name="prefix" value="/WEB-INF/views/" /> 
       <beans:property name="suffix" value=".jsp" /> 
     </beans:bean> 

</beans:beans> 

DaoImpl Класс:

public void add(Entity entity) { 

    try { 
      this.sessionFactory.getCurrentSession().save(entity); 
      this.sessionFactory.getCurrentSession().flush(); 
     } catch (Exception e) { 
      logger.error("Exception occured " + e); 
     } 
    } 

Это мой файл project configuration и dao impl class.

корня context.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd"> 

    <!-- <tx:annotation-driven transaction-manager="transactionManager" /> --> 
    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <context:component-scan base-package="com.abc" /> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
     <!-- <property name = "dataSource" ref = "dataSource"></property> --> 
     <property name="configLocation"> 
      <value>classpath:hibernate.cfg.xml</value> 
     </property> 
     <property name="entityInterceptor" ref ="auditLogInterceptor"/> 
    </bean> 

Выпуск
В настоящее время в hibernate.cfg.xml, я упомянул hibernate.connection.autocommit = верно и в daoimpl при сохранении сущности Мне нужно позвонить flush после .save.

Если удалить hibernate.connection.autocommit = True и .flush из daoimpl класса, я заметил, что .save метод daoimpl не работает, значит мои данные не вставляя и даже я не могу видеть вставки запроса, выполняемую спящего режима на консоли.

hibernate.connection.autocommit = true не должно быть в hibernate cfg xml, как если бы я выполнял операцию над несколькими таблицами в одной транзакции, и если произошла какая-либо ошибка, откат не произойдет.

Я хочу, чтобы .save в daoimpl должен работать даже я не пишу hibernate.connection.autocommit = true в hibernate cfg xml и .flush.

Я использую аннотацию @Transactional для транзакции.

+0

Возвращает любое сообщение об ошибке/исключение. В каком режиме вы используете спящий режим на i.e создаете или обновляете – Madusudanan

+0

Проверьте, есть ли у вас активная транзакция, и если генерируется какой-либо sql –

+0

@Madusudanan: никаких исключений на консоль не возникает. – VJS

ответ

2

Вы не добавили TransactionManager к конфигурации:

  1. Удалить следующие свойства:

    <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property> 
    <property name="hibernate.connection.autocommit">true</property> 
    <property name="hibernate.c3p0.min_size">5</property> 
    <property name="hibernate.c3p0.max_size">20</property> 
    <property name="hibernate.c3p0.timeout">300</property> 
    <property name="hibernate.c3p0.max_statements">50</property> 
    <property name="hibernate.c3p0.idle_test_period">3000</property> 
    
  2. добавить пул соединений DataSource (DBCP2 является гораздо лучшей альтернативой, чем C3P0)

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
        <property name="driverClassName" oracle.jdbc.driver.OracleDriver"/> 
        <property name="url" value="your-oracle-driver-url"/> 
        <property name="username" value="your-username"/> 
        <property name="password" value="your-password"/> 
    </bean> 
    
  3. Теперь добавьте Sessionf actory Spring прокси:

    <bean id="sessionFactory" 
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource" /> 
        <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
    </bean> 
    
  4. Добавить TransactionManager боб

    <bean id="transactionManager" 
        class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
        <property name="dataSource" ref="dataSource" /> 
        <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 
    

Update

Если у вас есть менеджер транзакций, установленный в контексте приложения в отдельной пружинной (например, корневой context.xml), а затем переместить эти строки из вашего веб-контекста, где фоновым контекст:

<tx:annotation-driven transaction-manager="transactionManager"/> 
<context:component-scan base-package="com.abc.service" /> 
<context:component-scan base-package="com.abc.dao" /> 

И только позволяют веб-контекст для сканирования своих собственных бобов:

<context:component-scan base-package="com.abc.web" /> 

It's not good to mix the web and the back-end contexts responsibilities ,

+0

Я не упоминал root-context .xml, в этой конфигурации 3 и 4 точки. Даже тогда спящий режим не выполняет запрос на вставку. Я тоже не получаю никаких исключений. Кажется, он просто игнорирует спасение. – VJS

+0

Проверь мой обновленный ответ –

+0

@ Влад Михальчеа: Спасибо. Я получил то, что решение моей проблемы связано с проверкой компонентов. Из вашего ответа кажется, что в пакете root-context необходимо указать пакет услуг и dao. В пакете servlet-context.xml необходимо указать пакет и пакет контроллера. Моя путаница такова: 1) пакет Entity также существует. 2) На уровне обслуживания мы делаем весеннее автоуниверку для dao classes. Если я упоминаю пакет услуг в корневом контексте.xml, то как сканирует аннотацию автозапуска весны. – VJS

0

Моя проблема решена, я просто написал аннотацию @Transactional в

@Repository 
@Transactional 
public class AbstractHibernateDao<T extends Serializable> { 

    private Class<T> clazz; 

    @Autowired 
    private SessionFactory sessionFactory; 

И решил, что я не смог удалить или сохранить без использования Flush.

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