JPA教程:映射实体–第1部分

在本文中,我将讨论JPA中的实体映射过程。 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 。

在前两篇文章中,我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写安装过程,因为Web上的大多数教程都完全做到了这一点。 因此,让我们直接跳过对象关系映射或实体映射。

Wikipedia定义对象关系映射如下:

计算机科学中的对象关系映射(ORM,O / RM和O / R映射)是一种编程技术,用于在面向对象编程语言中的不兼容类型系统之间转换数据。 实际上,这会创建一个“虚拟对象数据库”,可以在编程语言中使用它。 尽管有些程序员选择创建自己的ORM工具,但有执行对象关系映射的免费和商业软件包。

通常,映射是您将有关数据库的必要信息提供给ORM工具的过程。 然后,该工具使用此信息将对象读/写到数据库中。 通常,您告诉您的ORM工具表名称,特定类型的对象将保存到该表名称。 您还提供了对象属性将映射到的列名。 还需要指定不同对象类型之间的关系。 所有这些似乎都是很多任务,但是幸运的是,JPA遵循所谓的“ Convention over Configuration”方法,这意味着如果您采用JPA提供的默认值,则只需配置很少的部分应用程序。

为了在JPA中正确映射类型,您至少需要执行以下操作:

  1. 用@Entity批注标记您的课程。 这些类称为实体。
  2. 用@Id注释标记类的属性/获取方法之一。

就是这样。 您的实体已准备好保存到数据库中,因为JPA会自动配置映射的所有其他方面。 这也显示了使用JPA可以享受的生产率提高。 您无需在每次查询数据库时手动填充对象,从而避免编写大量样板代码。

让我们来看一个例子。 考虑以下我根据以上两个规则映射的地址实体:

import javax.persistence.Entity;
import javax.persistence.Id;@Entity
public class Address {@Idprivate 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;}
}

现在,根据您的环境,您可能会或可能不会在persistence.xml文件中添加此实体声明,我在上一篇文章中已经对此进行了解释。

好吧,让我们保存一些对象! 以下代码段正是这样做的:

import com.keertimaan.javasamples.jpaexample.entity.Address;
import javax.persistence.EntityManager;
import com.keertimaan.javasamples.jpaexample.persistenceutil.PersistenceManager;public class Main {public static void main(String[] args) {EntityManager em = PersistenceManager.INSTANCE.getEntityManager();Address address = new Address().setId(1).setCity("Dhaka").setCountry("Bangladesh").setPostcode("1000").setStreet("Poribagh");em.getTransaction().begin();em.persist(address);em.getTransaction().commit();System.out.println("addess is saved! It has id: " + address.getId());Address anotherAddress = new Address().setId(2).setCity("Shinagawa-ku, Tokyo").setCountry("Japan").setPostcode("140-0002").setStreet("Shinagawa Seaside Area");em.getTransaction().begin();em.persist(anotherAddress);em.getTransaction().commit();em.close();System.out.println("anotherAddress is saved! It has id: " + anotherAddress.getId());PersistenceManager.INSTANCE.close();}
}

现在让我们退后一步,想一想如果使用纯JDBC进行持久化,我们需要做什么。 对于这两种情况,我们必须手动编写插入查询并将每个属性映射到相应的列,这将需要大量代码。

关于示例需要注意的重要一点是我设置实体ID的方式。 这种方法仅适用于像这样的简短示例,但是对于实际应用而言,这不是很好。 通常,您通常希望使用自动递增的id列或数据库序列来生成实体的id值。 在我的示例中,我使用的是MySQL数据库,并且我所有的id列均设置为自动递增。 为了在我的实体模型中反映出这一点,我可以在id属性中使用一个名为@GeneratedValue的附加注释。 这告诉JPA,该实体的id值将在插入期间由数据库自动生成,并且应该在插入之后使用select命令获取该id。

经过上述修改,我的实体类变成了这样的东西:

import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.GeneratedValue;@Entity
public class Address {@Id@GeneratedValueprivate Integer id;// Rest of the class code........

插入过程变为:

Address anotherAddress = new Address().setCity("Shinagawa-ku, Tokyo").setCountry("Japan").setPostcode("140-0002").setStreet("Shinagawa Seaside Area");
em.getTransaction().begin();
em.persist(anotherAddress);
em.getTransaction().commit();

JPA如何确定用于保存地址实体的表? 事实证明,这很简单:

  1. 如果映射未提供任何明确的表信息,则JPA会尝试查找名称与实体名称匹配的表。
  2. 可以使用@Entity批注的“名称”属性显式指定实体的名称。 如果未找到名称属性,则JPA会假定实体的默认名称。
  3. 实体的默认名称是实体类的简单名称(非完全限定名称),在我们的情况下为Address。 因此,我们的实体名称随后被确定为“地址”。
  4. 由于我们的实体名称为“地址”,因此JPA会尝试查找数据库中是否存在名称为“地址”的表(请记住,大多数情况下数据库表名称均不区分大小写)。 从我们的模式中,我们可以看到确实如此。

那么,JPA如何确定我们用于保存地址实体属性值的列?

在这一点上,我认为您将能够轻松地猜测到这一点。 如果您不能,请继续关注我的下一篇文章!

直到下一次。

[完整的工作代码可以在github上找到。]

翻译自: https://www.javacodegeeks.com/2014/09/jpa-tutorial-mapping-entities-part-1.html

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

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

相关文章

table 设置边框

本文引自&#xff1a;https://www.cnblogs.com/leona-d/p/6125896.html 示例代码&#xff1a; <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width…

uniapp小程序 设置自定义导航栏

如下截图&#xff0c;通过 wx.getSystemInfoSync 计算得到的整个导航栏高度&#xff0c;其实是有3个部分的&#xff1a; 黄色&#xff1a;状态栏高度&#xff0c;uniapp文档中有给出&#xff1b;红色&#xff1a;胶囊高度&#xff0c;可以计算得出&#xff1b;绿色&#xff1a;…

linux 下 的串口模拟器 minicom 退出方法

ctrl a &#xff08;或 A&#xff09; 进入 minicom 的配置模式&#xff1a;终端外观上无任何变化&#xff01; 然后按下 z &#xff08;或 Z&#xff09; 方可打开配置帮助界面 然后按下 x &#xff08;或 X&#xff09;退出转载于:https://www.cnblogs.com/jinzhenshui/p/11…

WebSpher 6.1 安装与应用

1. 名词术语解释1.1 名词缩写&#xff1a;1、 WAS&#xff1a; 即IBM公司的应用服务器WebSphere Application Server的简称&#xff1b;2、 ND&#xff1a; 即IBM公司的应用服务器WebSphere Application Server Network Deployment的简称&#xff1b;3、 IHS&#xff1a; 即IBM…

PostCSS 基本用法

1、postcss相关网站 https://www.postcss.com.cn/ https://www.ibm.com/developerworks/cn/web/1604-postcss-css/ 2、介绍 PostCSS 的主要功能只有两个&#xff1a;第一个就是前面提到的把 CSS 解析成 JavaScript 可以操作的 抽象语法树结构&#xff08;Abstract Syntax T…

Akka Notes –演员记录和测试

在前两部分&#xff08; 一 &#xff0c; 二 &#xff09;中&#xff0c;我们简要讨论了Actor以及消息传递的工作方式。 在这一部分中&#xff0c;让我们看一下如何修复并记录我们的TeacherActor 。 概括 这就是我们上一部分中的Actor的样子&#xff1a; class TeacherActor …

vue笔记(二)Vue-class与style、事件、计算属性、数据监听、指令+自定义指令、过滤器

vue官网 一 、class、style操作 二、事件 三、计算属性 四、数据监听、观测 五、指令自定义指令 六、过滤器 一 、class、style操作 官网 1. class使用&#xff1a; &#xff08;1&#xff09;v-bind:class“数据|属性|变量|表达式” &#xff08;2&#xff09;v-bind:class“…

oracle_linux_6_64(bit)上安装oracle11gR2数据库环境快速准备神器oracle-rdbms-server-11gR2-preinstall...

https://blog.csdn.net/nalnait/article/details/81582637?tdsourcetags_pctim_aiomsg https://blog.csdn.net/ljunjie82/article/details/37373595?tdsourcetags_pctim_aiomsg 1、oracle linux上安装oracle数据库环境快速准备介绍 在Linux上安装oracle数据库&#xff0c;…

DevExpress控件之GridControl控件

DevExpress控件之GridControl控件http://blog.sina.com.cn/s/blog_6769068d0100iucx.html1. 设置数据源:string sql "select fid,fname from dual"; DataTable dt DALUse.Query(sql).Tables[0];gridControl1.DataSource dt;*:Daluse是项目数据库连接基类,不用特别…

Vue 中computed 与 methods 区别

1、示例 <!DOCTYPE html><html lang"zh"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><meta http-equiv"X-UA-Compatible" cont…

Nsum问题

题目 题解 暴力法 class Solution:def fourSum(self, nums: List[int], target: int) -> List[List[int]]:if len(nums) < 4:return []nums.sort()N len(nums)res []for i in range(N-3):for j in range(i1, N-2):for k in range(j1, N-1):for m in range(k1, N):tmp…

Hazelcast入门指南第4部分

这是我的Hazelcast系列的第四部分。 如果一个人没有看到其他三个人&#xff0c;我建议一个人去看第1 部分 &#xff0c; 第2 部分和第3部分 。 记录中 日志记录是任何应用程序的重要功能&#xff0c;我的示例也是如此。 System.out.println可以用作告诉用户控制台应用程序中正…

js笔记(一)js基础、程序结构、函数

大标题小节一、js 基础1. javascript的组成&#xff1b;2. 运行js&#xff1b;3. 打印信息&#xff1b;4. 关键字var&#xff1b;5. js中的数据类型&#xff1b;6. NaN&#xff08;not a number&#xff09;&#xff1b;7. js运算符&#xff1b;8. 数据类型转换&#xff1b;9. …

DB2 9 底子(730 考试)认证指南,第 3 局部: 拜访 DB2 数据(3)

建树第一个数据库First Steps在 DB2 的安顿进程中&#xff0c;会表示 First Steps 面板&#xff0c;它答运用户生成要操作的示例数据库&#xff1a; 选择 Database Creation 选项将表示一个附加菜单&#xff0c;可以建树 SAMPLE 数据库。 大大都用户希冀建树 SAMPLE 数据库并运…

《学习之道》第十二章专注后打断

奥运健儿并不是周末慢跑几个小时就速度超群&#xff0c;也不是闲暇时举几次哑铃就力拔千斤&#xff1b; 象棋大师也不是靠临时跑佛脚就能构筑起自己的神经结构。相反&#xff0c;他们都是在日积月累中&#xff0c;伴随着大量练习&#xff0c;才慢慢建立起自己的知识库的&#x…

vue class绑定方式

1、对象语法 <div class"static"v-bind:class"{ active: isActive, text-danger: hasError }"></div>data: {isActive: true,hasError: false} 2、数组语法 <div v-bind:class"[isActive ? activeClass : , errorClass]"><…

新的自定义控件:TaskProgressView

我已经编写了一个新的自定义控件&#xff0c;并将其提交到ControlsFX项目。 这是一个高度专业的控件&#xff0c;用于显示后台任务&#xff0c;其当前状态和进度的列表。 这实际上是我为ControlsFX编写的第一个控件&#xff0c;只是出于乐趣的考虑&#xff0c;这意味着我自己没…

js笔记(三)ES5、ES5新增的数组的方法、字符串的方法、字符编码、对象的序列化和反序列化、bind

数组方法、字符串方法总结 大目录小目录一、ES5严格模式1. 严格模式&#xff1b;2. 严格模式的行为变更&#xff1b;二、ES5新增的数组的方法1. 判断是否为数组&#xff1a;Array.isArray()&#xff1b;2. 判断数组中是否存在某个值&#xff1a;indexOf(data, start)、lastInd…

RabbitMQ消息队列帮助类

调用 //消息队列发消息MqConfigInfo config new MqConfigInfo();config.MQExChange "DrawingOutput";config.MQQueueName "DrawingOutput";config.MQRoutingKey "DrawingOutput";MqHelper heper new MqHelper(config);byte[] body Encodin…

SVG入门

1、简介 使用xml描述的矢量文件。 2、兼容性 https://caniuse.com/#searchsvg 3、使用方式 &#xff08;1&#xff09;浏览器直接打开 &#xff08;2&#xff09;html中使用img引用 <p><img src"simple.svg" width"50" height"50"…