Spring 3.1和JPA的持久层

1.概述

本教程显示了如何使用Hibernate作为持久性提供程序使用JPA设置Spring

有关使用基于Java的配置和项目的基本Maven pom设置Spring上下文的分步介绍,请参阅本文 。

2. Java的JPA Spring配置

要在Spring项目中使用JPA, 需要设置EntityManager

这是配置的主要部分,它是通过Spring工厂bean完成的,即更简单的LocalEntityManagerFactoryBean更灵活的LocalContainerEntityManagerFactoryBean 。 此处使用后一个选项,以便可以在其上配置其他属性:

@Configuration
@EnableTransactionManagement
public class PersistenceJPAConfig{@Beanpublic LocalContainerEntityManagerFactoryBean entityManagerFactoryBean() {LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();em.setDataSource(dataSource());em.setPackagesToScan(new String[] { "org.baeldung.persistence.model" });JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();em.setJpaVendorAdapter(vendorAdapter);em.setJpaProperties(additionalProperties());return em;}@Beanpublic DataSource dataSource(){DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/spring_jpa");dataSource.setUsername( "tutorialuser" );dataSource.setPassword( "tutorialmy5ql" );return dataSource;}@Beanpublic PlatformTransactionManager transactionManager(){JpaTransactionManager transactionManager = new JpaTransactionManager();transactionManager.setEntityManagerFactory(entityManagerFactoryBean().getObject() );return transactionManager;}@Beanpublic PersistenceExceptionTranslationPostProcessor exceptionTranslation(){return new PersistenceExceptionTranslationPostProcessor();}Properties additionalProperties() {return new Properties() {{  // Hibernate Specific: setProperty("hibernate.hbm2ddl.auto", "create-drop");setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5Dialect");}};}
}

另外,请注意,在Spring 3.2之前, cglib必须位于类路径中才能使Java @Configuration类起作用。 为了更好地理解cglib作为依赖项的需求,请参阅Spring中有关cglib工件的讨论 。

3.使用XML的JPA Spring配置

与XML相同的Spring配置:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd"><bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"><property name="dataSource" ref="dataSource" /><property name="packagesToScan" value="org.baeldung.persistence.model" /><property name="jpaVendorAdapter"><bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" /></property><property name="jpaProperties"><props><prop key="hibernate.hbm2ddl.auto">create-drop</prop><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop></props></property></bean><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url" value="jdbc:mysql://localhost:3306/spring_jpa" /><property name="username" value="tutorialuser" /><property name="password" value="tutorialmy5ql" /></bean><bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"><property name="entityManagerFactory" ref="myEmf" /></bean><tx:annotation-driven /><bean id="persistenceExceptionTranslationPostProcessor" class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" /></beans>

在XML中配置Spring和基于Java的新配置之间有一个相对小的差异–在XML中,对另一个bean的引用可以指向该bean或该bean的bean工厂。 但是在Java中,由于类型不同,编译器不允许这样做,因此首先从Bean工厂中检索EntityManagerFactory ,然后将其传递给事务管理器:

txManager.setEntityManagerFactory( this.entityManagerFactoryBean()。getObject() );

4.完全不用XML

通常,JPA通过META-INF / persistence.xml文件定义一个持久性单元。 从Spring 3.1开始,不再需要persistence.xml - LocalContainerEntityManagerFactoryBean现在支持'packagesToScan'属性,可以在其中指定要扫描@Entity类的软件包。

该文件是最后要删除的XML片段–现在, 无需使用XML即可完全​​设置JPA。

4.1。 JPA属性

JPA属性通常在persistence.xml文件中指定; 或者,可以将属性直接指定给实体管理器工厂bean:

factoryBean.setJpaProperties(this.additionalProperties());

附带说明一下,如果Hibernate将是持久性提供程序,则这将是指定Hibernate特定属性的方式。

5. Maven配置

除了Spring Core和持久性依赖关系(在Spring with Maven教程中详细显示)之外,我们还需要在项目中定义JPA和Hibernate,以及MySQL连接器

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>4.2.4.Final</version><scope>runtime</scope>
</dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.26</version><scope>runtime</scope>
</dependency>

请注意,MySQL依赖项作为参考包括在内-需要驱动程序来配置数据源,但是任何受Hibernate支持的数据库都可以。

六,结论

本教程说明了如何使用XML和Java配置在Spring中使用Hibernate配置JPA

我们还讨论了如何摆脱通常与JPA相关联的XML的最后一部分– persistence.xml 。 最终结果是一个轻量级的,干净的DAO实现,几乎没有依赖Spring的编译时。

可以在github项目中找到此Spring JPA教程的实现–这是一个基于Eclipse的项目,因此应该很容易直接导入和运行。

参考: Baeldung博客中的Spring 3和JPA与Hibernate的 合作,来自我们的JCG合作伙伴 Eugen Paraschiv。

翻译自: https://www.javacodegeeks.com/2011/12/persistence-layer-with-spring-31-and_14.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/374427.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

150928错误认识

1. $arr array(); foreach ($re as $k>$v){  $arr[] $v[updatetime];} $arr的返回结果为&#xff1a; Array ([0] > 2014-09[1] > 2015-04[2] > 2015-09 )$arr array(); foreach ($re as $k>$v){  $arr[$k] $v[updatetime];} $arr的返回结果为&#xff…

STM32F1笔记(一)GPIO输出

GPIO&#xff1a;General Purpose Input Output &#xff08;通用输入/输出&#xff09;。 GPIO最经典应用&#xff1a;LED灯。 先看电路。声明&#xff1a;参考正点原子战舰开发板。 与LED串联的电阻称为限流电阻。 限流电阻计算公式&#xff1a;R(U-LED压降)/20ma。 U为LE…

dataframe转化为array_【Python专栏】12 种高效 Numpy 和 Pandas 函数为你加速分析

来源&#xff1a;机器之心编译&#xff1a;Jamin、杜伟、张倩我们都知道&#xff0c;Numpy 是 Python 环境下的扩展程序库&#xff0c;支持大量的维度数组和矩阵运算&#xff1b;Pandas 也是 Python 环境下的数据操作和分析软件包&#xff0c;以及强大的数据分析库。二者在日常…

具有GlassFish和一致性的高性能JPA –第1部分

您以前听说过连贯性吗&#xff1f; 大概是。 它是那些著名的内存网格解决方案之一&#xff0c;该解决方案承诺了超快的数据访问速度和对经常使用的数据的无限空间。 一些众所周知的竞争对手是Infinispan &#xff0c; Memcached和Terracotta Ehcache 。 它们都很棒&#xff0c;…

如何在自己的代码中实现分享视频文件或者是图片文件到微信 QQ微博 新浪微博等!!!...

首先在文档第一句我先自嘲下 &#xff0c; 我是大傻逼&#xff0c; 弄了两天微信是视频分享&#xff0c;一直被说为啥跟系统的相册分享的不一样&#xff0c;尼玛&#xff01;&#xff01;&#xff01; 这里来说正文&#xff0c;我这里不像多少太多&#xff0c;大家都是程序猿&a…

sql 数据库中用创建好的视图修改表数据

只要满足下列条件&#xff0c;即可通过视图修改基础基表的数据&#xff1a; 1、任何修改&#xff08;包括 UPDATE、INSERT 和 DELETE 语句&#xff09;都只能引用一个基表的列。 2、视图中被修改的列必须直接引用表列中的基础数据。不能通过任何其他方式对这些列进行派生&#…

boost原理与sklearn源码_机器学习sklearn系列之决策树

一、 Sklearn库 Scikit learn 也简称 sklearn, 自2007年发布以来&#xff0c;scikit-learn已经成为Python重要的机器学习库了。支持包括分类、回归、降维和聚类四大机器学习算法。还包含了特征提取、数据处理和模型评估三大模块。sklearn是Scipy的扩展&#xff0c;建立在NumPy和…

STM32F1笔记(二)GPIO输入

STM32 GPIO输入的经典应用是按键。 先看电路。声明&#xff1a;参考正点原子战舰开发板。 在这里可以看到&#xff0c;KEY_UP按键是高电平有效的&#xff0c;即当按下该按键时&#xff0c;GPIO读到高电平。 KEY0/1/2是低电平有效的&#xff0c;即当按下该按键时&#xff0c;G…

Google Authenticator:将其与您自己的Java身份验证服务器配合使用

用于移动设备的Google Authenticator应用程序是一个非常方便的应用程序&#xff0c;它实现了TOTP算法&#xff08;在RFC 6238中指定&#xff09;。 使用Google Authenticator&#xff0c;您可以生成时间密码&#xff0c;该密码可用于在共享请求用户密钥的身份验证服务器中授权用…

[Week2 作业] 代码规范之争

这四个问题均是出自 http://goodmath.scientopia.org/2011/07/14/stuff-everyone-should-do-part-2-coding-standards/ 。 我对这四个问题均持反驳的看法&#xff0c;下面是我的理由~ Q1&#xff1a;这些规范都是官僚制度下产生的浪费大家的编程时间、影响人们开发效率, 浪费时…

STM32F1笔记(三)UART/USART

UART&#xff1a;Universal Asynchronous Receiver/Transmitter&#xff08;通用异步收/发器&#xff09; USART&#xff1a;Universal Synchronous/Asynchronous Receiver/Transmitter&#xff08;通用同步/异步串行收/发器&#xff09; 从命名即可看出USART就是UART的基础上…

python安装界面翻译_python环境搭建

如果想要运行python需要有解释器和编辑器。 什么是解释器 解释器我们可以把它理解成翻译官&#xff0c;它是将我们写的python代码翻译成计算机能够懂得机器语言。 然后计算机收到解释器的命令来干活&#xff0c;最终再将结果反馈在解释器中。 解释器推荐使用anaconda3 什么是an…

无需重新部署Eclipse和Tomcat即可进行更改

他们说&#xff0c;由于应用程序服务器过大&#xff0c;Java的开发速度很慢–您必须重新部署应用程序才能看到所做的更改。 使用PHP&#xff0c;Python等脚本语言时&#xff0c;可以“保存并刷新”。 这个法定问题总结了这个“神话”。 是的&#xff0c;这是一个神话。 您也可以…

进阶篇-用户界面:4.Android中常用组件

1.下拉菜单 在Web开发中&#xff0c;HTML提供了下拉列表的实现&#xff0c;就是使用<select>元素实现一个下拉列表&#xff0c;在其中每个下拉列表项使用<option>表示即可。这是在Web开发中一个必不可少的交互性组件&#xff0c;而在Android中的对应实现就是Spinne…

收款单单据编号不正确

问题现象:现在在应收&#xff0c;应付的收款单录入和付款单录入里点击增加的话&#xff0c;单据编号如果是出现2024呢&#xff0c;按保存的话&#xff0c;就会出现单据号重复&#xff1b;查到的最大的单据号是3034&#xff0c;在流水号里改成3038后再增回加的话还是出现2024。然…

STM32F1笔记(四)NVIC中断优先级管理

STM32将中断分为5个组&#xff0c;组0~4。配置代码如下&#xff1a; NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 在标准库里&#xff0c;分组的定义如下&#xff1a; /** defgroup Preemption_Priority_Group * {*/#define NVIC_PriorityGroup_0 ((uint32_t…

到底是什么程序和功能?

许多RDBMS支持“例程”的概念&#xff0c;通常将其称为过程和/或函数。 这些概念已经在编程语言中存在了一段时间了&#xff0c;而且不在数据库中。 区分程序和功能的著名语言是&#xff1a; 艾达 基本知识 帕斯卡 等等… &#xff08;存储的&#xff09;过程和&#xff08…

http的“无连接”指的是_http协议无状态中的 quot;状态quot; 到底指的是什么?...

引子&#xff1a;最近在好好了解http&#xff0c;发现对介绍http的第一句话【http协议是无状态的&#xff0c;无连接的】就无法理解了&#xff1a;无状态的【状态】到底指的是什么&#xff1f;&#xff01;找了很多资料不仅没有发现有一针见血正面回答这个问题的&#xff0c;而…

个人日志-7.4

姓名 刘鑫 时间 2016.7.4 学习内容 完善需求分析报告。撰写数据库设计说明书。初步安排计划概要设计说明书。调整项目开发计划说明书。 所遇问题 无 解决方案 无 转载于:https://www.cnblogs.com/liuxin13070013/p/5641967.html

通达信编程实例

1、放量a、今日比昨日的成交量放大了1倍&#xff1a;VOL/REF(VOL, 1)>2; b、今日的五日均量比五天前的五日均量放大了3倍&#xff1a;AA:MA(VOL, 5);BB:REF(AA, 5);AA/BB>4&#xff1b; c、今天的成交量达到了整个流通盘的10%以上(注意&#xff0c;10%的表达式是10/100或…