2012-11-30 51 views
6

Tôi đang sử dụng Spring 3.1.2 và Hibernate 4.1.7 cho ứng dụng web của mình. Tôi muốn bây giờ cấu hình cả hai. Tôi có hibernate.cfg.xml tập tin của tôi:Tại sao phải định cấu hình cả dataSource và sessionFactory trong Cấu hình 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> 

My webapp-servlet.xml mùa xuân tập tin cấu hình:

<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. Tại sao tôi cần phải cấu hình một bean DataSource khi tất cả các dữ liệu cần thiết đã được bao gồm trong cấu hình hibernate tập tin? Có Hibernate có một số mặc định nó có thể sử dụng?
  2. Một số khác là DataSource tôi có thể sử dụng?
  3. Tôi có thiếu bất kỳ hạt đậu nào khác hoặc thông số cấu hình/thuộc tính để làm việc ở chế độ ngủ đông với ứng dụng của tôi không?
+1

Tất cả các tùy chọn cấu hình từ 'hibernate.cfg của bạn.xml' có sẵn trên 'LocalSessionFactoryBean', thích thứ hai và bỏ qua chúng trong cấu hình Hibernate. –

+0

Ok. Nhưng tôi vẫn chỉ muốn họ ở một nơi duy nhất, không lặp lại trong các tập tin khác nhau hoặc đậu. –

+2

Đó là những gì tôi đang nói, loại bỏ cấu hình nguồn dữ liệu từ 'hibernate.cfg.xml' và để nó trong Spring XML. Sau đó, bạn có thể sử dụng cùng một bean 'dataSource', ví dụ: trong 'JdbcTemplate'. –

Trả lời

8
  1. Bạn không cần cả hai. Bạn có thể loại bỏ hibernate.cfg.xml và định cấu hình mọi thứ trong LocalSessionFactoryBean hoặc sử dụng lại hibernate.cfg.xml hiện tại của bạn (trong trường hợp này bạn không cần định cấu hình DataSource trong cấu hình Spring).

  2. Bạn có các tùy chọn sau:

    • Sử dụng embedded database - đó là tốt để thử nghiệm và học tập mục đích

    • Sử dụng DriverManagerDataSource - đó là một nguồn dữ liệu phi gộp đơn giản mà có thể được sử dụng để thử nghiệm, vv (không được khuyến cáo sử dụng trong sản xuất)

    • Sử dụng nhóm kết nối như DBCP hoặc c3p0

    • Nếu bạn triển khai đến máy chủ ứng dụng mà bạn có thể sử dụng hồ bơi kết nối được cung cấp bởi các máy chủ ứng dụng using JNDI

  3. cấu hình hiện tại của bạn là đủ, nhưng nó thiếu sự ủng hộ của Spring transaction management. Để kích hoạt nó, bạn cần phải

    • Khai HibernateTransactionManager

    • Thêm <tx:annotation-driven> để cho phép quản lý giao dịch khai báo (@Transactional)

    • Khai TransactionTemplate nếu bạn muốn sử dụng quản lý giao dịch theo chương trình (sử dụng nó để khắc phục các hạn chế của quản lý giao dịch khai báo)

    • Cũng đừng quên để loại bỏ tính chất giao dịch liên quan đến từ cấu hình Hibernate vì chúng có thể mâu thuẫn với quản lý giao dịch Xuân

+0

Không Hibernate sử dụng C3P0 theo mặc định? Cảm ơn bạn đã quản lý giao dịch, tôi cũng đang tìm kiếm điều đó. Được chấp nhận là câu trả lời đầy đủ. –

+1

@SotiriosDelimanolis: Nếu bạn định cấu hình nó bằng cách sử dụng 'hibernate.cfg.xml' - có. Nhưng Spring decouples cấu hình Hibernate từ cấu hình 'DataSource', do đó bạn có thể sử dụng các triển khai' DataSource' khác nhau. – axtavt

Các vấn đề liên quan