java 为什么在 Spring-Hibernate Configuration 中同时配置 dataSource 和 sessionFactory?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/13653591/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Why configure both dataSource and sessionFactory in Spring-Hibernate Configuration?
提问by Sotirios Delimanolis
I'm using Spring 3.1.2 and Hibernate 4.1.7 for my web application. I want to now configure both of these. I have my hibernate.cfg.xml
file:
我的 Web 应用程序使用 Spring 3.1.2 和 Hibernate 4.1.7。我现在想配置这两个。我有我的hibernate.cfg.xml
文件:
<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
spring config file:
我的webapp-servlet.xml
弹簧配置文件:
<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>
- Why do I need to configure a DataSource bean when all of the data needed is already included in the hibernate configuration file? Does Hibernate have some default it can use?
- What are some other
DataSource
s I can use? - Am I missing any other beans or configuration parameters/properties to get hibernate working with my application?
- 当所有需要的数据都已经包含在休眠配置文件中时,为什么我需要配置一个 DataSource bean?Hibernate 是否有一些可以使用的默认值?
DataSource
我可以使用哪些其他s?- 我是否缺少任何其他 bean 或配置参数/属性来使我的应用程序休眠?
回答by axtavt
You don't need both of them. You can either get rid of
hibernate.cfg.xml
and configure everything inLocalSessionFactoryBean
, or reuse your existinghibernate.cfg.xml
as is (in this case you don't need to configureDataSource
in Spring config).You have the following options:
Use embedded database- it's good for testing and learning purposes
Use
DriverManagerDataSource
- it's a simple non-pooled datasource that can be used for testing, etc (not recommended for production use)Use connection pool such as DBCP or c3p0
If you deploy to application server you can use connection pool provided by the application server using JNDI
Your current configuration is sufficient, but it lacks support of Spring transaction management. In order to enable it you need to
Declare
HibernateTransactionManager
Add
<tx:annotation-driven>
to enable declarative transaction management (@Transactional
)Declare
TransactionTemplate
if you want to use programmatic transaction management (use it to overcome limitations of declarative transaction management)Also don't forget to remove transaction-related properties from Hibernate configuration since they may conflict with Spring transaction management
你不需要他们两个。您可以删除
hibernate.cfg.xml
并配置 中的所有内容LocalSessionFactoryBean
,也可以hibernate.cfg.xml
按原样重新使用现有的(在这种情况下,您不需要DataSource
在 Spring 配置中进行配置)。您有以下选择:
您当前的配置已经足够了,但是它缺乏对Spring 事务管理的支持。为了启用它,您需要
宣布
HibernateTransactionManager
添加
<tx:annotation-driven>
以启用声明式事务管理 (@Transactional
)声明
TransactionTemplate
是否要使用程序化事务管理(用它来克服声明式事务管理的局限性)另外不要忘记从 Hibernate 配置中删除与事务相关的属性,因为它们可能与 Spring 事务管理发生冲突