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

jpa 实体映射视图

在本文中,我将讨论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 实体映射视图

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

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

相关文章

php连接函数config,smarty内置函数config_load用法实例

本文实例讲述了smarty内置函数config_load用法。分享给大家供大家参考。具体如下:{config_load}用于从配置文件中,加载到配置变量。详细用法如下:配置文件:foo.conf说明:[Table] 和 [Customer] 表示段落名称。复制代码…

python写前端图形界面_如何Tkinter模块编写Python图形界面

一、为何使用Tkinter而非PyQt众所周知,在Python中创建图形界面程序有很多种的选择,其中PyQt和wxPython都是很热门的模块包,这些第三方的图形界面模块功能强大、配置丰富,界面美观,是很多人的选择。州的先生也经常使用P…

适用于应用程序错误的AWS警报

监视对于任何实际应用都是关键的。 您必须知道正在发生的事情,并在发生问题时实时得到警报。 AWS拥​​有CloudWatch,可以自动为您提供大量指标。 但是,您必须定义一些自己的东西。 然后,您需要定义适当的警报。 在这里&#xff…

addcslashes php,php addcslashes函数怎么用

php addcslashes函数返回在指定字符前添加反斜杠的字符串。其语法是addcslashes(string,characters),参数string是必须的,规定要转义的字符串,characters是必须,规定要转义的字符或字符范围。addcslashes函数怎么用?作…

struct类型重定义 不同的基类型_C++构造数据类型

结构体(struct)定义:结构体是一个数据类型,是由多个不同类型的数据组成的数据集合。关键字为:struct 。优点:大大减少程序代码的离散性,使程序代码阅读更加符合逻辑。语法:struct 结构体类型名{ 成员类型 成…

卡夫卡队列_卡夫卡编年史队列基准

卡夫卡队列总览 最近,我被要求比较《卡夫卡》和《编年史》的性能。 没有两个产品是完全一样的,要进行公平的比较并不容易。 我们可以尝试运行类似的测试,看看我们得到了什么结果。 该测试基于Apache Kafka性能结果 。 测试使用了什么&#…

php zip怎么安装,php如何安装zip模块?(方法介绍)

php 安装zip模块为php安装zip扩展wget http://pecl.php.net/get/zip-1.13.5.tgz tar -zvxf zip-1.13.5.tgz cd zip-1.13.5 /home/xxx/php/bin/phpize出现错误:Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment va…

vs如何写多线程_java中的多线程的示例

在讨论多线程之前,让我们先讨论线程。线程是进程中轻量级的最小部分,可以与同一进程的其他部分(其他线程)并发运行。线程是独立的,因为它们都有独立的执行路径,这就是为什么如果一个线程中发生异常,它不会影响其他线程…

OCA第4部分中的Java难题

在Java Puzzlers的第四部分中,我们有一些与char类型有关的东西。 public class Puzzler { public static void main(String[] args){ char myChar a ; myChar; System.out.println(myChar); } } 您可能已经猜到了。 它将打印“ b”,其原因是char类型是…

matlab mex路径,使用matlab进行mex编译时的路径问题mexopts

matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件。这些文件免不了使用include下的*.h和lib下的*.lib文件。举matlab和vs 进行混合编程时总需要使用matlab编译mexFunction.cpp文件。这些文件免不了使用include下的*.h和lib下的*.lib文件。举例说明&#xff0…

python怎么运行ln函数_Python基础篇(五)

bool用于判断布尔值的结果是True还是False>>> bool("a")True>>> bool(3)True>>> bool("")False>>> bool(0)FalsePython中的elif类似于Java中的elseif>>> number (int)(input("input a number: ")…

hystrix应用 博客_用Hystrix保护您的应用程序

hystrix应用 博客在先前的帖子http://www.javacodegeeks.com/2014/07/rxjava-java8-java-ee-7-arquillian-bliss.html中,我们讨论了微服务以及如何使用(RxJava)的Reactive Extensions编排微服务。 但是,如果一项或多项服务因已停止…

python除法函数一般如何命名_关于python:当用于除法时,’/’和’//’之间有什么区别?...

使用一个对另一个有好处吗?在Python2中,它们似乎都返回相同的结果:>>> 6/32>>> 6//32请参考整数除法的问题,因为引入了//运算符进行整数除法。在python 3.0中,5 / 2将返回2.5,5 // 2将返…

艾默生变频器报警PHP,艾默生ct变频器报警ou 这个CT的变频器报警UU怎么解决?

1, 这个CT的变频器报警UU怎么解决?(1) 控制板Q1(15050026)坏。(2) 7840坏:在变频器通电时,用直流档,黑接5脚,红分别接6,7,8脚,值为2.5,2.5,5为正常,否则7840坏。(3) 小板坏:在变频器…

Project Reactor展开方法

最近,我的一位同事向我介绍了Project Reactor类型的expand运算符,在这篇文章中,我想介绍几种使用它的方式。 展开分页结果 考虑在名为City的模型上基于Spring Data的存储库: import org.springframework.data.jpa.repository.Jpa…

同时买票是怎么实现的_去巴黎玩怎么买地铁票最划算?| 巴黎最全交通攻略

次票、天票、机场票……傻傻分不清楚。不会法语怎么办?什么时候买有优惠?看这一篇全知道​​巴黎作为国际大都市,交通还是非常方便的。基本上80%的巴黎景点都能坐地铁到达,就在我们平常所说的小巴黎里。整个巴黎岛(Ile…

php输入地址查询,PHP查询用户IP所在地址

原创内容,转载请注明出处:https://www.myzhenai.com.cn/post/3042.html关键词:IP所在地址 IP地址 PHP获取ip地址相关内容:获取IP所处位置的Shell代码:https://www.myzhenai.com.cn/post/2917.htmlWordPress获取当前浏览…

javafx css_JavaFX技巧13:研究Modena CSS文件

javafx css到目前为止,这是最简单,最短的提示。 如果要执行以下任何操作: 了解如何使用CSS 使您的自定义控件看起来像标准控件 重用标准控件使用的SVG路径图形(例如,滚动条箭头) 弄清楚如何浏览标准控件…

python彩票数据分析案例_天津Python人工智能课程

Python人工智能课程介绍人工智能主要致力于计算机视觉,自然语言处理与语音识别三大领域!其基础与核心都是机器学习,当下AI时代各大行业巨头公司都在争相追逐这些热门领域,创业公司更是层出不穷,人工智能工程师的需求量…

swig模板 PHP,如何使用nodejs前端模板引擎swig

这次给大家带来如何使用nodejs前端模板引擎swig,使用nodejs前端模板引擎swig的注意事项有哪些,下面就是实战案例,一起来看一下。相对于jade,我还是更喜欢swig前端模板引擎,jade虽然语法简练高效了不少,但是…