java中的jpa_JPA教程–在Java SE环境中设置JPA

java中的jpa

JPA代表Java Persistence API,它基本上是一个规范,描述了一种将数据持久存储到持久存储(通常是数据库)中的方法。 我们可以将其视为类似于Hibernate之类的ORM工具的东西,除了它是Java EE规范的正式组成部分(并且Java SE也支持它)。 有很多原因需要学习像JPA这样的ORM工具。 我不会详细介绍这个问题,因为网络上已经有很多帖子可以完美地回答这个问题,例如这个问题或这个问题 。 但是,我们还应该记住, 这不是解决所有问题的灵丹妙药 。
刚开始使用JPA时,我很难设置它,因为Web上的大多数文章都是针对Java EE环境编写的,而我却试图在Java SE环境中使用它。 我希望本文对将来希望这样做的人有所帮助。
在此示例中,我们将使用Maven设置所需的依赖关系。 由于JPA只是一个规范,因此我们也需要一个实现。 JPA有许多不错的免费实现(例如EclipseLink,Hibernate等)。 在本文中,我选择使用Hibernate。 至于数据库,我将使用MySQL。 让我们首先创建一个简单的Maven项目。 我已经从命令行使用快速入门原型创建了我的。 如果您不知道该怎么做,可以按照本教程进行操作 。 好的,接下来让我们获取JPA的依赖项。 在pom.xml中包括以下几行:

<dependency><groupId>javax.persistence</groupId><artifactId>persistence-api</artifactId><version>1.0.2</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>4.3.6.Final</version><exclusions><exclusion><groupId>org.hibernate.javax.persistence</groupId><artifactId>hibernate-jpa-2.1-api</artifactId></exclusion></exclusions>
</dependency>

第一个依赖关系指定标准的JPA接口,第二个依赖关系指定实现。 以这种方式包含JPA依赖关系是可取的,因为它使我们将​​来可以自由切换特定于供应商的实现,而不会遇到太大问题( 请参阅此处的详细信息 )。 但是,由于API版本1.0.2是作为独立JAR发布的最后一个版本,因此我们将无法使用该API的最新版本。 在撰写本文时,JPA规范的最新版本是2.1,尚无法独立获得(尽管有很多 要求 )。 如果我们现在想使用那个,那么我们唯一的选择是从特定于供应商的JAR中选择,或者使用提供API及其实现的应用服务器。 我决定使用Hibernate提供的API规范。 在这种情况下,仅包含以下依赖关系就足够了:

<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>4.3.6.Final</version>
</dependency>

下一步将包括对MySQL的依赖关系。 在pom.xml中包括以下几行:

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.31</version>
</dependency>

包括其余依赖项(即jUnit,Hamcrest等)之后,完整的pom.xml如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.keertimaan.javasamples</groupId><artifactId>jpa-example</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>jpa-example</name><url>http://www.codesod.com</url><properties><java.version>1.8</java.version><hibernate.version>4.3.6.Final</hibernate.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!-- JPA --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>${hibernate.version}</version></dependency><!-- For connection pooling --><dependency><groupId>org.hibernate</groupId><artifactId>hibernate-c3p0</artifactId><version>${hibernate.version}</version></dependency><!-- Database --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.31</version></dependency><!-- Test --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope><exclusions><exclusion><groupId>org.hamcrest</groupId><artifactId>hamcrest-core</artifactId></exclusion></exclusions></dependency><dependency><groupId>org.hamcrest</groupId><artifactId>hamcrest-all</artifactId><version>1.3</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.5.1</version><configuration><source>${java.version}</source><target>${java.version}</target><compilerArgument>-Xlint:all</compilerArgument><showWarnings>true</showWarnings><showDeprecation>true</showDeprecation></configuration></plugin></plugins></build>
</project>

现在是时候配置我们的数据库了。 我将从这本出色的在线书中找到的所有将来的JPA示例中都将使用以下模式:

数据库架构

数据库架构


在本地MySQL安装中,按照上述模式创建一个等效的数据库。 下一步是创建persistence.xml文件,该文件将包含我们的数据库特定信息供JPA使用。 默认情况下,JPA希望此文件位于META-INF文件夹下的类路径中。 对于我们的Maven项目,我已经在project_root / src / main / resources / META-INF文件夹下创建了此文件:

<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistencehttp://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd"version="2.1"><persistence-unit name="jpa-example" transaction-type="RESOURCE_LOCAL"><provider>org.hibernate.jpa.HibernatePersistenceProvider</provider><properties><property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/jpa_example" /><property name="javax.persistence.jdbc.user" value="root" /><property name="javax.persistence.jdbc.password" value="my_root_password" /><property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /><property name="hibernate.show_sql" value="true" /><property name="hibernate.format_sql" value="true" /><property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /><property name="hibernate.hbm2ddl.auto" value="validate" /><!-- Configuring Connection Pool --><property name="hibernate.c3p0.min_size" value="5" /><property name="hibernate.c3p0.max_size" value="20" /><property name="hibernate.c3p0.timeout" value="500" /><property name="hibernate.c3p0.max_statements" value="50" /><property name="hibernate.c3p0.idle_test_period" value="2000" /></properties></persistence-unit>
</persistence>

如果您绝对是JPA的初学者,则上面的文件需要一些解释。 在我的下一篇文章中,我将尽可能地解释它,但是对于运行此示例,您只需更改前三个属性值以匹配您的环境(即数据库名称,用户名和密码)即可。 还要记下持久性单元元素的name属性的值。 此值稍后将在代码中用于实例化EntityManagerFactory实例。
好的,现在让我们创建一个实体来测试我们的配置。 创建一个名为Address的类,其中包含以下内容:

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;@Entity
@Table(name = "address")
public class Address {@Id@GeneratedValueprivate Integer id;private String street;private String city;private String province;private String country;private String postcode;/*** @return the id*/public Integer getId() {return id;}/*** @param id the id to set*/public Address setId(Integer id) {this.id = id;return this;}/*** @return the street*/public String getStreet() {return street;}/*** @param street the street to set*/public Address setStreet(String street) {this.street = street;return this;}/*** @return the city*/public String getCity() {return city;}/*** @param city the city to set*/public Address setCity(String city) {this.city = city;return this;}/*** @return the province*/public String getProvince() {return province;}/*** @param province the province to set*/public Address setProvince(String province) {this.province = province;return this;}/*** @return the country*/public String getCountry() {return country;}/*** @param country the country to set*/public Address setCountry(String country) {this.country = country;return this;}/*** @return the postcode*/public String getPostcode() {return postcode;}/*** @param postcode the postcode to set*/public Address setPostcode(String postcode) {this.postcode = postcode;return this;}
}

此类已正确映射到地址表,并且其实例已准备就绪,可以持久存储在数据库中。 现在,让我们创建一个名为PersistenceManager的帮助程序类,其中包含以下内容:

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;public enum PersistenceManager {INSTANCE;private EntityManagerFactory emFactory;private PersistenceManager() {// "jpa-example" was the value of the name attribute of the// persistence-unit element.emFactory = Persistence.createEntityManagerFactory("jpa-example");}public EntityManager getEntityManager() {return emFactory.createEntityManager();}public void close() {emFactory.close();}
}

现在让我们在Main方法中编写一些示例持久性代码以测试所有内容:

import javax.persistence.EntityManager;public class Main {public static void main(String[] args) {Address address = new Address();address.setCity("Dhaka").setCountry("Bangladesh").setPostcode("1000").setStreet("Poribagh");EntityManager em = PersistenceManager.INSTANCE.getEntityManager();em.getTransaction().begin();em.persist(address);em.getTransaction().commit();em.close();PersistenceManager.INSTANCE.close();}
}

如果检查数据库,则会看到新记录已插入地址表中。 本文介绍了如何在不使用Spring之类的其他框架的情况下设置JPA。 但是,使用Spring设置JPA是一个非常好的主意,因为在这种情况下,我们无需担心管理实体经理,交易等问题。除了设置JPA之外,Spring 对于许多其他目的也非常有用。 今天就这样。 在下一篇文章中,我将尝试解释persistence.xml文件和相应的配置值。 敬请关注!

  • 完整的代码可以在github上找到。

翻译自: https://www.javacodegeeks.com/2014/08/jpa-tutorial-setting-up-jpa-in-a-java-se-environment.html

java中的jpa

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

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

相关文章

php中des加密cbc模式,php中加密解密DES类的简单使用方法示例

本文实例讲述了php中加密解密DES类的简单使用方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;在平时的开发工作中&#xff0c;我们经常会对关键字符进行加密&#xff0c;可能为了安全 也可能为了规范&#xff0c;所以要正确使用DES加密解密代码1:class DES{var $k…

java 并发线程_Java并发教程–线程之间的可见性

java 并发线程当在不同线程之间共享对象的状态时&#xff0c;除了原子性外&#xff0c;其他问题也会发挥作用。 其中之一是可见性。 关键事实是&#xff0c;如果没有同步&#xff0c;则不能保证指令按照它们在源代码中出现的顺序执行。 这不会影响单线程程序中的结果&#xff…

维持硒测试自动化的完美方法

毫无疑问&#xff0c; 自动浏览器测试已经改变了软件开发的工作方式。 如果不是Selenium&#xff0c;我们将无法像我们一样使用各种各样的无错误Web应用程序。 但是有时&#xff0c;甚至IT部门也误解了自动化一词。 大多数人认为计算机将为他们完成所有测试&#xff01; 他们最…

双色球霸主网络问题_霸主–统治和管理API的地方

双色球霸主网络问题今天我们生活在一个越来越分散的世界中。 如今的计算机系统不再是在随机桌子下面的某些硬件上运行单个部门项目&#xff0c;而是大规模&#xff0c;集中甚至分散地运行。 监视和管理的需求从未改变&#xff0c;但是随着时间的推移变得越来越复杂。 如果将所有…

php验证码 php中文网,ThinkPHP 使用不同风格及中文的验证码

使用其他风格验证码在上文《ThinkPHP 验证码详解及实例》中了解了 ThinkPHP 验证码的具体用法&#xff0c;本文将进一步介绍如何使用不同风格的验证码以及使用中文验证码。上文例子使用的是默认参数&#xff0c;也就是生成 4 位的数字验证码。buildImageVerify 方法生成验证码时…

java 开发人员工具_Java开发人员应该知道的5种错误跟踪工具

java 开发人员工具随着Java生态系统的发展&#xff0c;可满足不断增长的请求和用户对高性能需求的Web应用程序成为了新型的现代开发工具。 具有快速新部署的快速节奏环境需要跟踪错误&#xff0c;并以传统方法无法维持的水平获得对应用程序行为的洞察力。 在本文中&#xff0c;…

Apache Camel 3.2 – Camel的无反射配置

在Apache Camel项目中&#xff0c;我们正在努力开发下一个即将发布的下一个Apache Camel 3.2.0版本。 我们在Camel 3中努力研究的问题之一就是使其变得更小&#xff0c;更快。 其中一个方面是配置管理。 您可以按照12要素原则以多种方式完全配置Camel&#xff0c;以使配置与应…

java jsoup解析_3使用Jsoup解析Java中HTML文件的示例

java jsoup解析HTML是Web的核心&#xff0c;无论您是通过JavaScript&#xff0c;JSP&#xff0c;PHP&#xff0c;ASP或任何其他Web技术动态生成的&#xff0c;您在Internet上看到的所有页面都是基于HTML的。 您的浏览器实际上是解析HTML并为您呈现它。 但是&#xff0c;如果需要…

【AI提示词艺术】第12期 摄影艺术构图处理和人像生成的技巧

摄影艺术构图 星空宇宙 关键词&#xff1a; 强烈的明暗对比,8k,精细的描述,相片纸,超高分辨率,无建筑的,大自然,星空&#xff0c;云朵&#xff0c;刺眼流星&#xff0c;群星&#xff0c;银河&#xff0c;仰视视角&#xff0c;广角镜头 以下是按照提示词类别整理的相关描述&a…

Kogito,ergo规则:从知识到服务,轻松自如

欢迎阅读有关Kogito倡议的博客系列的另一集&#xff0c;以及我们将Drools带入云的努力。 这些文章的目的是收集用户对我们提供给Kogito的功能的早期反馈。 在本文中&#xff0c;我们介绍了两种实现完整智能服务的新方法 &#xff1a; 独立的规则服务 集成智能工作流程和规则…

linux 读取内存颗粒,Linux虚拟内存地址转化成物理内存地址

背景现代手机这种SOC(system on chip)&#xff0c;因为功耗、Modem等功能soc上集成了很多core,他们还可以是独立的系统在运转。比如ADSP简介ADSP(Application Digital Signal Processing)就是高通的Hexagon DSP ,就是独立运转的一个coresystem。这样做不仅可以使用soc上的专用核…

primefaces_PrimeFaces扩展中的全新JSF组件

primefacesPrimeFaces扩展团队很高兴宣布即将推出的3.0.0主要版本的几个新组件。 我们的新提交者Francesco Strazzullo为该项目提供了“ Turbo Boost”&#xff0c;并带来了至少6个已成功集成的 JSF组件&#xff01; 当前的开发状态是OpenShift上的deployet – 请查看展示柜。以…

linux中memcpy实现分析,ARM64 的 memcpy 优化与实现

如何优化 memcpy 函数Linux 内核用到了许多方式来加强性能以及稳定性&#xff0c;本文探讨的 memcpy 的汇编实现方式就是其中的一种&#xff0c;memcpy 的性能是否强大&#xff0c;拷贝延迟是否足够低都直接影响着整个系统性能。通过对拷贝函数的理解可以加深对整个系统设计的一…

ejb生命周期_EJB 3.x:生命周期和并发模型(第2部分)

ejb生命周期这是两部分系列的第二篇。 第一部分介绍了有状态和无状态EJB的生命周期以及并发行为。 我将在本文中介绍Singleton EJB 。 Singleton模式可以说是最常用&#xff08;有时被滥用&#xff01;&#xff09;的模式。 单吨又爱它&#xff01; Java EE使我们无需编写显…

JDK 14 / JEP 305模式匹配“ Smart Casts”实例

我通常将Java代码中instanceof运算符的存在视为“ 红色标志 ”&#xff0c;这意味着在某些情况下使用instanceof不一定是错误的&#xff0c;但是使用它有时表示可以以一种更干净的方式解决设计问题&#xff0c;如所述本文末尾引用的一些资源中的内容&#xff08;包括有关Java以…

易流即时配送_即时大数据流处理=即时风暴

易流即时配送在Ubuntu背后的公司Canonical&#xff0c;每6个月进行一次技术工作&#xff0c;以第一手测试我们的工具并向其他人展示新想法。 这次&#xff0c;我创建了一个即时大数据解决方案&#xff0c;更具体地讲是“即时风暴”。 Storm现在是Apache基金会的一部分&#xf…

csp真题字符串匹配c语言,CCF CSP认证考试历年真题 模板生成系统 C语言实现

试题编号&#xff1a;201509-3试题名称&#xff1a;日期计算 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述&#xff1a;成成最近在搭建一个网站&#xff0c;其中一些页面的部分内容来自数据库中不同的数据记录&#xff0c;但是页面的基本结构是相同的。例如&…

osgi架构与linux_OSGi:进入微服务架构的门户

osgi架构与linux在构建可扩展&#xff0c;可靠的分布式系统的背景下&#xff0c;“模块化”和“微服务体系结构”这两个术语如今经常出现。 众所周知&#xff0c;Java平台本身在模块化方面很弱&#xff08; Java 9将通过交付Jigsaw项目来解决此问题&#xff09;&#xff0c;这为…

引入我们全新的YouTube频道进行视频课程编程

嘿&#xff0c;极客们&#xff0c; 收到社区的反馈并紧贴行业发展趋势&#xff0c;我们非常高兴宣布推出全新的Youtube频道 &#xff01; 在我们的频道上&#xff0c;我们将主持与Java编程有关的视频课程&#xff0c;但通常也会进行软件开发。 我们将介绍代码演练以及完整的…

田忌赛马c语言程序设计,还是杭电1052田忌赛马

已结贴√问题点数&#xff1a;20 回复次数&#xff1a;2还是杭电1052田忌赛马//昨天那个算法漏洞挺大&#xff0c;但我重新构思了&#xff0c;但运行到312ms还是wa了。我测试了许多数据&#xff0c;结果是对的&#xff0c;郁闷了&#xff0c;谁能救救我啊&#xff1f;#include&…