Spring 3.1 + JPA 2.0 (Hibernate 4) + MySQL 配置_hibernate 4.x + jpa 2.0-程序员宅基地

技术标签: Hibernate  JPA+Hibernate  SpringMVC  JPA  Spring  

查看Hibernate tutorial,Hibernate提供了3种方式实现ORM:

1. Native Hibernate APIs and hbm.xml Mappings

2. Native Hibernate APIs and Annotation Mappings

3. Java Persistence API (JPA)

第一种方式对象类的定义对象与数据库间的映射配置信息是分开的,对象类就是一平常Java类,配置信息就一hbm.xml文件。用这种方式,看似划分清晰,但写起来和用起来感觉不是太爽,一是写的东西多,写的多出错的机会就大;二是不停地在对象类和配置文件间来回切换,闪得慌。第二种方式直接将hbm.xml配置文件扔掉,将配置信息以Annotation风格与对象类紧密结合在一起。整合之后感觉清爽不少,少写了不少代码,对象属性与数据库表紧密结合,代码维护成本大大减少。第三种方式采用了JPA 2.0,JPA是ORM的一种规范,定义了操作的标准接口,对应该接口已有几种实现:Hibernate,EclipseLink。与第二种方式相比,JPA方式需要一persistence.xml配置文件。

对比上述三种方式,个人比较倾向于第三种,原因一是拥有Annotation带来的优点,二来如果那天不想使用Hibernate了,改用其他类似EclipseLink,或者其他的ORM,更换代价非常小。

        Spring 3.1相比之前版本,出现了一新特征:JPA EntityManageFactory bootstrapping without persistence.xml。这一特征的出现,进一步简化了Spring与JPA间的整合:移走persistence.xml。


下面就是对Spring与JPA 2.0 (Hibernate 4)整合的配置文件:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  4.     xmlns:p="http://www.springframework.org/schema/p"  
  5.     xmlns:tx="http://www.springframework.org/schema/tx"   
  6.     xmlns:context="http://www.springframework.org/schema/context"  
  7.     xmlns:util="http://www.springframework.org/schema/util"  
  8.     xsi:schemaLocation="  
  9.             http://www.springframework.org/schema/beans   
  10.             http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
  11.             http://www.springframework.org/schema/tx   
  12.             http://www.springframework.org/schema/tx/spring-tx-3.1.xsd  
  13.             http://www.springframework.org/schema/context  
  14.             http://www.springframework.org/schema/context/spring-context-3.1.xsd  
  15.             http://www.springframework.org/schema/util   
  16.             http://www.springframework.org/schema/util/spring-util-3.1.xsd">  
  17.   
  18.   
  19.     <!-- Data Source -->  
  20.     <bean id="dataSource"  
  21.         class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
  22.         <property name="driverClassName" value="com.mysql.jdbc.Driver" />  
  23.         <property name="url" value="jdbc:mysql://localhost:3306/hibernate" />  
  24.         <property name="username" value="root" />  
  25.         <property name="password" value="" />  
  26.     </bean>  
  27.   
  28.     <!-- This will ensure that Hibernate or JPA exceptions are automatically   
  29.         translated into Spring's generic DataAccessException hierarchy for those   
  30.         classes annotated with Repository. For example, see ***DAOImpl. -->  
  31.     <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />  
  32.   
  33.   
  34.     <!-- JPA Entity Manager Factory -->  
  35.     <bean id="entityManagerFactory"  
  36.         class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"  
  37.         p:packagesToScan="com.haibin.rest" p:dataSource-ref="dataSource"  
  38.         p:jpaVendorAdapter-ref="hibernateVendor" p:jpaPropertyMap-ref="jpaPropertyMap" />  
  39.   
  40.     <util:map id="jpaPropertyMap">  
  41.         <entry key="hibernate.hbm2ddl.auto" value="update" />  
  42.         <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />  
  43.   
  44.         <!-- To enable Hibernate's second level cache and query cache settings -->  
  45.         <entry key="hibernate.max_fetch_depth" value="4" />  
  46.         <entry key="hibernate.cache.use_second_level_cache" value="true" />  
  47.         <entry key="hibernate.cache.use_query_cache" value="true" />  
  48.         <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory" />  
  49.     </util:map>  
  50.   
  51.     <bean id="hibernateVendor"  
  52.         class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"  
  53.         p:database="MYSQL" p:showSql="true" p:generateDdl="true"  
  54.         p:databasePlatform="org.hibernate.dialect.MySQLDialect" />  
  55.   
  56.     <!-- Transaction Config -->  
  57.     <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"  
  58.         p:entityManagerFactory-ref="entityManagerFactory">  
  59.         <property name="jpaDialect">  
  60.             <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />  
  61.         </property>  
  62.     </bean>  
  63.   
  64.     <!-- User declarative transaction management -->  
  65.     <tx:annotation-driven transaction-manager="transactionManager" />  
  66.       
  67.   
  68. </beans>  

配置文件主要包含了5个部分:

1.  Data source Configuration

2.  JPA Entity Manager Factory Configuration

3.  Transaction Configuration

4.  Transaction Management

5.  Exception

具体内容就不赘述了,尝试一下的话,可以参考或修改:Spring+JPA 微笑


注:最近写了一篇综合运用Spring各种相关技术的博文,涉及到技术包含了Spring 3.1.3, Spring MVC, Hibernate 4.1.7, EhCache, Spring Data JPA 1.1.0, MySQL 5, Spring Security 3.1.3, Spring Mail, Recapcha, c3p0,博文包含了各种技术的详尽配置信息,最后给出了可运行的源码。新博文对数据相关的配置进行了更新请查阅:基于Spring的注册登录系统,配置请查看第6部分spring-data.xml配置文件。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zhpengfei0915/article/details/9258851

智能推荐

计算机系统启动项设置密码,电脑开机第一道密码怎么设置 - 卡饭网-程序员宅基地

文章浏览阅读5.9k次。笔记本电脑怎么进CMOS密码巧设置笔记本电脑怎么进CMOS密码巧设置 笔记本电脑为了保护用户的数据安全,往往采用加密的方式,最常见的还是CMOS密码加密技术。为了让你的重要数据更加安全,你可能需要设置不同的密码,这也就要求你记住许多密码。对于笔记本电脑用户来说,真的需要设置一道道密码关卡吗?非也非也! 一、认识与设置笔记本电脑的CMOS密码 笔记本电脑的CMOS密码大致分为超级密码(Supervi..._电脑第一道密码修改

VulnHub靶机-Jangow: 1.0.1_jangow01-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏5次。迟到的文章,就当库存发出来吧~_jangow01

spark实战之RDD的cache或persist操作不会触发transformation计算_spark cache和persist不生效-程序员宅基地

文章浏览阅读1.7w次,点赞2次,收藏5次。默认情况下RDD的transformation是lazy形式,实际计算只有在ation时才会进行,而且rdd的计算结果默认都是临时的,用过即丢弃,每个action都会触发整个DAG的从头开始计算,因此在迭代计算时都会想到用cache或persist进结果进行缓存。敝人看到很多资料或书籍有的说是persist或cache会触发transformation真正执行计算,有的说是不会!敝人亲自实验了一把..._spark cache和persist不生效

html文字滚动_html滚动-程序员宅基地

文章浏览阅读2.4k次。HTML之marquee(文字滚动)详解语法:以下是一个最简单的例子:代码如下:Hello, World下面这两个事件经常用到:onMouseOut=“this.start()” :用来设置鼠标移出该区域时继续滚动onMouseOver=“this.stop()”:用来设置鼠标移入该区域时停止滚动代码如下:onMouseOut=“this.start()” :用来设置鼠标移出该区域时继续滚动 onMouseOver=“this.stop()”:用来设置鼠标移入该区域时停止滚动这是一个完_html滚动

leecode++理解_auto row : rows-程序员宅基地

leecode++理解:本文介绍了一些LeetCode题目的解析和思路,包括两数相加、寻找有序数组的中位数、最长字串、整数反转等。还讨论了一些下标规律和正则表达式匹配问题。

Java通过Socket实现UDP编程及Socket总结_java xsocket jar包,实现udp服务端-程序员宅基地

文章浏览阅读8.5k次,点赞2次,收藏28次。UDPServer.javaimport java.io.IOException;import java.net.DatagramPacket;import java.net.DatagramSocket;import java.net.InetAddress;/* * 服务器端,实现基于UDP的用户登陆 */public class UDPServer { public s_java xsocket jar包,实现udp服务端

随便推点

【实践】基于spark的CF实现及优化_spark cf-程序员宅基地

文章浏览阅读1.4w次。最近项目中用到ItemBased Collaborative Filtering,实践过spark mllib中的ALS,但是因为其中涉及到降维操作,大数据量的计算实在不能恭维。所以自己实践实现基于spark的分布式cf,已经做了部分优化。目测运行效率还不错。以下代码package modelimport org.apache.spark.broadcast.Broadcastimp_spark cf

ijkplayer直播播放器使用经验之谈——卡顿优化和秒开实现_libijkplayer 播放直播流卡顿-程序员宅基地

文章浏览阅读1.8w次。 在我的博客移动平台播放器ijkplayer开源框架分析(以IOS源码为例),大致介绍了一下ijkplayer的基本函数调用顺序和主要线程作用,本博客想介绍一下在直播应用中,针对卡顿和秒开做的一些优化,本优化经验主要是用在Android系统上,ios上也可以借鉴,按本博客修改代码,网络带宽足够的情况下,音视频播放基本流畅不卡顿,首屏时间在500ms以内。 首先来看直播应用中的卡顿。直..._libijkplayer 播放直播流卡顿

数据挖掘实践(金融风控-贷款违约预测)(三):特征工程_金融风控(大数据)特征工程-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏28次。数据挖掘实践(金融风控-贷款违约预测)(三):特征工程目录数据挖掘实践(金融风控-贷款违约预测)(三):特征工程1.引言2.特征预处理2.1缺失值填充2.2时间格式处理2.3类别特征处理3.异常值处理3.1 检测异常的方法一:正态分布法3.2 检测异常的方法二:箱型图3.3异常值的处理方法4.数据分桶5.特征交互6.特征编码6.1 labelEncode 直接放入树模型中6.2 逻辑回归等模型要单独增加的特征工程7.特征选择7.1 Filter7.2 Wrapper (Recursive feature _金融风控(大数据)特征工程

关于datagrip与mysql连接时下载驱动失败时的解决方法_datagrip插件下载失败-程序员宅基地

文章浏览阅读1.1k次,点赞7次,收藏11次。2️⃣若失败消息提示需要更换http,去阿里云中找到相关镜像 测试连接通过后重新下载驱动。3️⃣上述方法还是不行 可以关闭data grip后再来几遍。1️⃣首先将电脑连接的Wi-Fi关闭 连接手机热点。_datagrip插件下载失败

Npm包管理工具_h5页面能使用npm包管理工具么-程序员宅基地

文章浏览阅读162次。一、介绍Npm包管理工具,JS开发者能够更方便的分享和复用以及更新代码,被复用的代码被称为包或者模块,一个模块中包含了一到多个js文件。在模块中一般还会包含一个package.json的文件,该文件中包含了该模块的配置信息。一个完整的项目,需要依赖很多个模块。一个完整的npm包含三部分npm网站-----用于预览npm管理的包注册机制-----用于上传包,使用数据库来维护包与上传者..._h5页面能使用npm包管理工具么

google html5 摄像头,chrome html5如何调用摄像头?-程序员宅基地

文章浏览阅读154次。如果是通过chrome调用摄像头的话:navigator.mediaDevices.enumerateDevices().then(gotDevices).catch(errorCallback);...function gotDevices(deviceInfos) {...for (var i = 0; i !== deviceInfos.length; ++i) {var deviceInf..._navigator.mediadevices.enumeratedevices() 将摄像头渲染到 video