免费的wordpress主题好,seo服务 文库,为企业为什么做网站,免费网站打包在本文中#xff0c;我将讨论JPA中的实体映射过程。 至于我的示例#xff0c;我将使用与 我以前的一篇文章中使用的模式相同的模式 。 在前两篇文章中#xff0c;我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写安装过程#xff0c;因为Web上的大多数教程… 在本文中我将讨论JPA中的实体映射过程。 至于我的示例我将使用与 我以前的一篇文章中使用的模式相同的模式 。 在前两篇文章中我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写安装过程因为Web上的大多数教程都完全做到了这一点。 因此让我们直接跳过对象关系映射或实体映射。 Wikipedia定义对象关系映射如下 计算机科学中的对象关系映射ORMO / RM和O / R映射是一种编程技术用于在面向对象编程语言中的不兼容类型系统之间转换数据。 实际上这会创建一个“虚拟对象数据库”可以在编程语言中使用它。 尽管有些程序员选择创建自己的ORM工具但有执行对象关系映射的免费和商业软件包。 通常映射是您将有关数据库的必要信息提供给ORM工具的过程。 然后该工具使用此信息将对象读/写到数据库中。 通常您告诉您的ORM工具表名称特定类型的对象将保存到该表名称。 您还提供了对象属性将映射到的列名。 还需要指定不同对象类型之间的关系。 所有这些似乎都是很多任务但是幸运的是JPA遵循所谓的“ Convention over Configuration”方法这意味着如果您采用JPA提供的默认值则只需配置很少的部分应用程序。 为了在JPA中正确映射类型您至少需要执行以下操作 用Entity批注标记您的课程。 这些类称为实体。 用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 {IdGeneratedValueprivate 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如何确定用于保存地址实体的表 事实证明这很简单 如果映射未提供任何明确的表信息则JPA会尝试查找名称与实体名称匹配的表。 可以使用Entity批注的“名称”属性显式指定实体的名称。 如果未找到名称属性则JPA会假定实体的默认名称。 实体的默认名称是实体类的简单名称非完全限定名称在我们的情况下为Address。 因此我们的实体名称随后被确定为“地址”。 由于我们的实体名称为“地址”因此JPA会尝试查找数据库中是否存在名称为“地址”的表请记住大多数情况下数据库表名称均不区分大小写。 从我们的模式中我们可以看到确实如此。 那么JPA如何确定我们用于保存地址实体属性值的列 在这一点上我认为您将能够轻松地猜测到这一点。 如果您不能请继续关注我的下一篇文章 直到下一次。 [完整的工作代码可以在github上找到。] 翻译自: https://www.javacodegeeks.com/2014/09/jpa-tutorial-mapping-entities-part-1.html