一般的JPA项目,要求在META-INF目录下对JPA的基础配置信息做配置。主要在persistence.xml文件中进行配置,主要配置有dataSource ,jpa提供的厂商类HibernatePersistenceProvider,以及一些Hibernate的参数,如showsql,ddl自动生成等。
参考如下博客中的配置方式。
https://blog.csdn.net/blueboz/article/details/79424657
而我们主要讲Spring中的配置方法,同样的,Spring提供了
org.springframework.orm.jpa.LocalEntityManagerFactoryBean
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
两个类,这两个类本质都一样,根据JPA配置,生成一个EntityManager,也就是我们Hibernate里面的SessionFactory啦。
那么有什么区别呢?
我们知道,一般的JPA项目都会有那个万恶的persistence-unit,持久化单元。
<persistence-unit name="bozPU" transaction-type="RESOURCE_LOCAL">
这个持久化单元都会有一个名称.name,如上面的bozPU。
我们获取这个PU,通过如下的方式
EntityManagerFactory factory = Persistence.createEntityManagerFactory("jpa");
而第一个FactoryBean恰恰跟这个一样
<bean id=”entityManagerFactory” class=”org.springframework.orm.jpa.LocalEntityManagerFactoryBean”>
<property name="persistenceUnitName" value="bozPU"/>
</bean>
采用第二种则有点不同,第二种不需要persisitence.xml文件
完全是在配置中进行配置
<!-- 实体管理器 -->
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="cn.boz.jpa" />
<!-- 指定持久化实现产商类,不同厂商不一样,hibernate是PersistenceProvider,如果classpath只有一个是不需要进行配置的 -->
<property name="persistenceProvider">
<bean class="org.hibernate.jpa.HibernatePersistenceProvider" />
</property>
<!--基础的配置信息,包含showsql,ddl,更新策略-->
<property name="jpaVendorAdapter">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<property name="generateDdl" value="true" />
<property name="database" value="MYSQL" />
<property name="databasePlatform"
value="org.hibernate.dialect.MySQL5InnoDBDialect" />
<property name="showSql" value="true" />
</bean>
</property>
<property name="jpaDialect">
<bean
class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
</property>
<property name="jpaPropertyMap">
<map>
<entry key="hibernate.query.substitutions"
value="true 1, false 0" />
<entry key="hibernate.default_batch_fetch_size" value="16" />
<entry key="hibernate.max_fetch_depth" value="2" />
<entry key="hibernate.generate_statistics" value="false" />
<entry key="hibernate.bytecode.use_reflection_optimizer"
value="true" />
<entry key="hibernate.cache.use_second_level_cache"
value="false" />
<entry key="hibernate.cache.use_query_cache" value="false" />
</map>
</property>
</bean>
配置完了EntityManagerFactory,需要配置如下信息
<!-- 事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory"
ref="entityManagerFactory" />
</bean>
<!--数据源信息-->
<bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
<property name="jdbcUrl"
value="jdbc:mysql:///cas?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC"></property>
<property name="driverClassName"
value="com.mysql.jdbc.Driver"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<!--声明式事务-->
<tx:annotation-driven
transaction-manager="transactionManager" proxy-target-class="true" />
<!-- service包 -->
<context:component-scan
base-package="cn.boz.jpa" />
<!-- 使用cglib进行动态代理 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
下面这一块是关于SpringDataDao 的配置,主要是扫描的包所在目录
<jpa:repositories base-package="cn.boz.jpa.dao"
repository-impl-postfix="Impl"
entity-manager-factory-ref="entityManagerFactory"
transaction-manager-ref="transactionManager" />
其中repository-impl-postfix这个属性,因为SpringData中,所有Dao是实现JpaRepository这个接口的,参考如下文章。
https://www.cnblogs.com/dreamroute/p/5173896.html