spring jpa结合hibernate配置

时间:2021-12-28 16:28:26

首先,为什么要用spring jpa结合hibernate,原因很简单,hibernate在结合spring jpa后,变得更方便了,代码量大大减少,查询数据库库起来更方便了。

我们先来看看如何配置spring jpa;配置spring jpa之前,我们要先配置数据库源,如下

<!--oracle数据源配置 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close" abstract="false" lazy-init="default" autowire="default">
		<property name="driverClass">
			<value>oracle.jdbc.driver.OracleDriver</value>
		</property>
		<property name="jdbcUrl">
			<value>jdbc:oracle:thin:@127.0.0.1:1521:test</value>
		</property>
		
		<property name="user">
			<value>root</value>
		</property>
		<property name="password">
			<value>root</value>
		</property>
		<property name="maxPoolSize"><!--最大线程池数 -->
			<value>5</value>
		</property>
		<property name="minPoolSize"><span style="font-family: Arial, Helvetica, sans-serif;"><!--最小线程池数 --></span>
			<value>1</value>
		</property>
		<property name="initialPoolSize"><span style="font-family: Arial, Helvetica, sans-serif;"><!--初始化程池数 --></span>
			<value>1</value>
		</property>
	</bean>
为什么要在dataSource中加 destory-method="close" abstract="false" lazy-init="default" autowire="default"等参数呢?

我一个一个来解答疑问。第一,加destory-method="close"从字面上的理解是,销毁方法关闭,我认为可以理解为关闭其他方法对该'数据库'bean的销毁,保证数据库的保持连接性能,我只是简单的回答了下。网上搜索的回答也非常片面,有兴趣可以看看该博客

http://alinazh.blog.51cto.com/5459270/1276304  。那么abstract="false"又是什么呢?我自己一看这个设置我第一的认识就是该方法是抽象方法关闭(不允许抽象),那到底是不是呢?从网上收集资料来看,这个的意思是‘false’不允许被其他实例化。第三,lazy-init="default"

这个设置就非常的关键了,加了这个后可以减少不必要的操作,从 http://blog.csdn.net/mezheng/article/details/7772073 该博客来看,它的作用是不实例化,有利于容器效率,对于不需要先使用的不管。第四,autowire="default" 自动装配功能,连数据库bean那就不需要配置了。接下来说说如何配置这个数据库线程池配置,首先配置驱动程序(不同的数据库有不同的驱动),然后就是‘jdbcurl’这个就是链接数据库的地址,有了地址之后就是账号,密码,然后就是配置线程池,其实还有许多配置,在这就不一一讲了,有兴趣可以参考 

http://www.2cto.com/database/201503/382805.html 讲解比较详细。那么数据源配置好了,接下来就是配置spring jdbc了,

<!-- Jpa Entity Manager 配置 -->
	<bean id="entityManagerFactory"
		class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
		<property name="dataSource" ref="dataSource" />
<!--指定 jpa管理的类-->
		<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
		<property name="packagesToScan" value="test" />
		<property name="jpaProperties">
			<props>
				<!-- 命名规则 My_NAME->MyName -->
				<prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
			</props>
		</property>
	</bean>
<bean id="hibernateJpaVendorAdapter"
<span style="white-space:pre">		</span>class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<span style="white-space:pre">		</span><property name="showSql" value="false" />
<span style="white-space:pre">	</span></bean>
<!-- 配置Spring Data Jpa扫描目录 -->
<span style="white-space:pre">	</span><jpa:repositories base-package="test"
<span style="white-space:pre">		</span>transaction-manager-ref="transactionManager"
<span style="white-space:pre">		</span>factory-class="BasicRepositoryFactoryBean"
<span style="white-space:pre">		</span>entity-manager-factory-ref="entityManagerFactory" />


<span style="white-space:pre">	</span><!-- Jpa 事务配置 -->
<span style="white-space:pre">	</span><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<span style="white-space:pre">		</span><property name="entityManagerFactory" ref="entityManagerFactory" />
<span style="white-space:pre">	</span></bean>


<span style="white-space:pre">	</span><!-- 启用 annotation事务 -->
<span style="white-space:pre">	</span><tx:annotation-driven transaction-manager="transactionManager"
<span style="white-space:pre">		</span>proxy-target-class="true" />
</pre>这是jpa的配置,配置entityManagerFactory子属性dataSource,也就是数据源,jpaVendorAdapter这个很关键,它是指定jpa管理的类别,packagesToScan是指定jpa扫描的目录 jpaProperties中配置了命名规则如表名是My_NAME则转为MyName.<p></p><p>到这里,spring jpa托管hibernate配置已经基本完成了。在配置Spring Data Jpa 中有个factory-class="BasicRepositoryFactoryBean"这个是用来生成例如hibernate的sessionFactory的中间件,</p><pre name="code" class="java">public class BasicRepositoryFactoryBean<T extends JpaRepository<Object, Serializable>>
		extends JpaRepositoryFactoryBean<T, Object, Serializable> {

	@Override
	protected RepositoryFactorySupport createRepositoryFactory(
			EntityManager entityManager) {

		return new BasicJpaRepositoryFactory(entityManager);
	}
}