首先,为什么要用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); } }