2012-11-30 10 views
6

Używam Spring 3.1.2 i Hibernate 4.1.7 dla mojej aplikacji internetowej. Chcę teraz skonfigurować oba te. Mam hibernate.cfg.xml plik:Dlaczego warto skonfigurować zarówno źródło danych, jak i źródło sesji w konfiguracji Spring-Hibernate?

<hibernate-configuration> 
    <session-factory> 
     <property name="connection.url">jdbc:mysql://localhost:3306/test</property> 
     <property name="connection.username">root</property> 
     <property name="connection.password">root</property> 
     <property name="connection.driver_class">com.mysql.jdbc.Driver</property> 
     <property name="hibernate.connection.pool_size">10</property> 
     <property name="hibernate.connection.autocommit">false</property> 
     <property name="dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> 
     <!-- 
     <property name="transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</property> 
     --> 
     <property name="hibernate.show_sql">true</property> 
     <property name="hibernate.hbm2ddl.auto">update</property>  
    </session-factory> 
</hibernate-configuration> 

Moja webapp-servlet.xml wiosna config file:

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

<bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource"> 
    <property name = "driverClassName" value = "com.mysql.jdbc.Driver" /> 
    <property name = "url" value = "jdbc:mysql://localhost:3306/test" /> 
    <property name = "username" value = "root" /> 
    <property name = "password" value = "root" /> 
    <property name = "maxActive" value = "10" /> 
</bean> 
</beans> 
  1. Dlaczego muszę skonfigurować fasoli DataSource gdy wszystkie dane potrzebne są już uwzględnione w konfiguracji hibernacji plik? Czy Hibernate ma pewne ustawienia domyślne, z których może korzystać?
  2. Które inne mogą być użyte w innych wersjach ?
  3. Czy brakuje mi innych komponentów lub parametrów konfiguracyjnych/właściwości, aby hibernacja działała z moją aplikacją?
+1

Wszystkie opcje konfiguracyjne od 'hibernate.cfg.xml' są dostępne na 'LocalSessionFactoryBean', wolą drugie i pomijają je w konfiguracji hibernacji. –

+0

Ok. Ale nadal chcę ich tylko w jednym miejscu, a nie powtarzać w różnych plikach lub fasolach. –

+2

To, co mówię, usuń konfigurację źródła danych z 'hibernate.cfg.xml' i pozostaw ją w Spring XML. Możesz później użyć tego samego komponentu bean "dataSource", np. w 'JdbcTemplate'. –

Odpowiedz

8
  1. Nie trzeba ich obu. Możesz albo pozbyć się hibernate.cfg.xml i skonfigurować wszystko w LocalSessionFactoryBean, albo ponownie użyć istniejącego hibernate.cfg.xml, tak jak jest (w tym przypadku nie musisz konfigurować DataSource w Spring config).

  2. Dostępne są następujące opcje:

    • Zastosowanie embedded database - to jest dobre dla celów testowych i uczenia

    • Zastosowanie DriverManagerDataSource - to prosty zakaz zbiorcza źródła danych, które mogą być używane do testowania, itp. (niezalecane do użytku produkcyjnego)

    • Użyj puli połączeń, takiej jak DBCP lub c3p0

    • Jeśli wdrożyć na serwerze aplikacji można korzystać z puli połączeń dostarczanych przez serwer aplikacji using JNDI

  3. Twoja obecna konfiguracja jest wystarczająca, ale brakuje wsparcia Spring transaction management. W celu umożliwienia mu trzeba

    • stwierdzenie HibernateTransactionManager

    • Dodaj <tx:annotation-driven> włączyć deklaratywny zarządzanie transakcjami (@Transactional)

    • stwierdzenie TransactionTemplate jeśli chcesz używać programową obsługę transakcji (używać go w celu przezwyciężenia ograniczeń deklaratywnego zarządzania transakcjami)

    • Nie zapomnij również w celu usunięcia właściwości związane z transakcją od konfiguracji hibernacji, ponieważ mogą one kolidować z zarządzaniem transakcji wiosennym

+0

Czy Hibernate nie używa domyślnie C3P0? Dzięki za zarządzanie transakcjami, również tego szukałem. Zaakceptowana jako pełna odpowiedź. –

+1

@SotiriosDelimanolis: Jeśli skonfigurowałeś go używając 'hibernate.cfg.xml' - yes. Ale Spring oddziela konfigurację Hibernate od konfiguracji 'DataSource', dlatego możesz użyć różnych implementacji' DataSource'. – axtavt

Powiązane problemy