在本文中,我将讨论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

JPA教程:映射实体–第1部分相关推荐

  1. JPA教程:实体映射-第2部分

    在上一篇文章中,我展示了一种持久保存实体的简单方法. 我解释了JPA用于确定实体默认表的默认方法. 假设我们要覆盖此默认名称. 我们之所以喜欢这样做,是因为数据模型是以前设计和修复的,并且表名与我们的 ...

  2. JPA教程:实体映射-第3部分

    在上一篇文章中,我展示了两种读取/写入持久实体状态的不同方法-字段和属性. 使用字段访问模式时,JPA使用反射直接从实体的字段读取状态值. 如果我们没有明确指定列名,它将直接将字段名转换为数据库列名. ...

  3. mysql jpa 批注 视图_通过JPA注解映射视图的实体类 jpa 视图 无主键 @Query注解的用法(Spring Data JPA) jpa 使用sql语句...

    参考: https://blog.csdn.net/qq465235530/article/details/68064074 https://www.cnblogs.com/zj0208/p/6008 ...

  4. jpa 实体映射视图_JPA教程:映射实体–第1部分

    jpa 实体映射视图 在本文中,我将讨论JPA中的实体映射过程. 至于我的示例,我将使用与 我以前的一篇文章中使用的模式相同的模式 . 在前两篇文章中,我解释了如何在Java SE环境中设置JPA. ...

  5. jpa 实体映射视图_JPA教程:实体映射-第2部分

    jpa 实体映射视图 在上一篇文章中,我展示了一种持久保存实体的简单方法. 我解释了JPA用于确定实体默认表的默认方法. 假设我们要覆盖此默认名称. 我们之所以喜欢这样做,是因为数据模型是以前设计和修 ...

  6. 怎么把arraylist集合的值放在实体类的属性了_原创 | 使用JPA实现DDD持久化-O/R映射元数据:类级映射-实体和值对象...

    类级映射:实体和值对象 可以被持久化的类包括实体和值对象两大类. 一.实体映射 通过给一个类添加@Entity逻辑注解,告知JPA这是一个可以持久化的实体类. 请注意@Entity逻辑注解不可以继承. ...

  7. Spring Data JPA教程

    在Java类或对象与关系数据库之间管理数据是一项非常繁琐且棘手的任务. DAO层通常包含许多样板代码,应简化这些样板代码,以减少代码行数并使代码可重复使用. 在本教程中,我们将讨论Spring数据的J ...

  8. 关于ORM中只有XML没有映射实体的分析

    开篇 上篇我们写了关于<关于ORM中只有XML没有映射实体的思考?期待大家的建议>这篇文章中描述了几个可能的实现思路,但是总体来说,经过大家的建议和提醒,我发现了一些比较好的思 路,在这里 ...

  9. jpa配置映射包_JPA – Hibernate –包级别的类型映射

    jpa配置映射包 当我们最终成熟到可以在JPA中使用某些自定义类型映射时,我们通常会停留在某些提供程序特定的解决方案上,因为JPA本身并未定义任何用于执行此操作的机制. 让我为您展示一个JPA提供程序 ...

最新文章

  1. 密码学研究-数字签名
  2. do while循环猜电脑给出的随机数
  3. STL容器的线程安全
  4. 每日一题(6)—— sizeof用法
  5. Mysql数据库知识总结
  6. 烂泥:windows server 2008取消关闭事件跟踪
  7. 系统集成项目管理工程师历年真题下载地址
  8. 匹配滤波器及matlab仿真
  9. 美团加载Dialog(小人奔跑)
  10. Pspice for TI取消默认打开方式
  11. 程序员的数学基础课:编程中的数学思维
  12. 举个栗子!Tableau技巧(22):如何导入其它地图源
  13. java中ArrayList小案例(快敲20遍++)
  14. java 无符号右移_java中的无符号移位运算
  15. Python的海龟绘图库turtle中tracer(False)和speed(0)的区别
  16. 计算机桌面背景滚动播出,哪个知道怎么设置壁纸滚动
  17. 「CSS」文本编排相关的CSS属性设置
  18. 显示error 1044错误代码
  19. 口袋网咖已有服务器在使用怎么注销,口袋网咖_口袋网咖常见问题_口袋网咖专区...
  20. ES系列四、ES6.3常用api之文档类api

热门文章

  1. 常用的数据交换格式有哪些_高程数据格式介绍
  2. (转)web.xml 中的listener、 filter、servlet 加载顺序及其详解
  3. MySQL的CRUD操作+使用视图
  4. 在diy的文件系统上创建文件的流程
  5. 高特权级代码段转向低特权级代码段(利用 ret(retf) 指令实现 jmp from ring0 to ring3)
  6. 纯注解开发配置spring
  7. aws lambda_API网关和AWS Lambda进行身份验证
  8. 侦听127.0.01_Spring 4.2中由注释驱动的事件侦听器
  9. 虚拟机间延迟测量_简单的类来测量延迟
  10. 启动jboss_3种启动JBoss BPM流程的基本方法