首先,为什么要用spring jpa结合hibernate,原因很简单,hibernate在结合spring jpa后,变得更方便了,代码量大大减少,查询数据库库起来更方便了。
我们先来看看如何配置spring jpa;配置spring jpa之前,我们要先配置数据库源,如下
<!--oracle数据源配置 -->为什么要在dataSource中加 destory-method="close" abstract="false" lazy-init="default" autowire="default"等参数呢?
<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>
我一个一个来解答疑问。第一,加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> {@Overrideprotected RepositoryFactorySupport createRepositoryFactory(EntityManager entityManager) {return new BasicJpaRepositoryFactory(entityManager);}}