jpa 实体映射视图_JPA教程:实体映射-第3部分

jpa 实体映射视图

在上一篇文章中,我展示了两种读取/写入持久实体状态的不同方法-字段和属性。 使用字段访问模式时,JPA使用反射直接从实体的字段读取状态值。 如果我们没有明确指定列名,它将直接将字段名转换为数据库列名。 在属性访问模式下,getter / setter方法用于读取/写入状态值。 在这种情况下,我们使用相同的注释来注释实体状态的getter方法,而不是字段。 如果我们未明确指定数据库列名称,则按照JavaBean约定确定它们,即通过从getter方法名称中删除“ get”部分并将方法名称其余部分的首字母转换为小写字符来确定。


我们可以通过在实体类声明中使用@Access注释来指定用于实体的访问方式。 此注释采用AccessType类型的参数(在javax.persistence包中定义)枚举,该参数具有对应于两种不同访问模式( FIELDPROPERTY )的两个不同值。 例如,我们可以通过以下方式为Address实体指定属性访问模式:

@Entity
@Table(name = "tbl_address")
@Access(AccessType.PROPERTY)
public class Address {private Integer id;private String street;private String city;private String province;private String country;private String postcode;private String transientColumn;@Id@GeneratedValue@Column(name = "address_id")public Integer getId() {return id;}public Address setId(Integer id) {this.id = id;return this;}public String getStreet() {return street;}public Address setStreet(String street) {this.street = street;return this;}public String getCity() {return city;}public Address setCity(String city) {this.city = city;return this;}public String getProvince() {return province;}public Address setProvince(String province) {this.province = province;return this;}public String getCountry() {return country;}public Address setCountry(String country) {this.country = country;return this;}public String getPostcode() {return postcode;}public Address setPostcode(String postcode) {this.postcode = postcode;return this;}
}

关于上述示例的几点注意事项:

  1. 如前所述,我们现在使用@ Id, @ GeneratedValue@Column注释注释实体ID的getter方法。
  2. 由于现在列名称将通过解析getter方法来确定,因此我们不再需要使用@Transient注释来标记transientColumn字段。 但是,如果Address实体具有名称以“ get”开头的任何其他方法,则我们需要在其上应用@Transient

如果一个实体没有显式的访问模式信息,就像我们在本系列第一部分中创建的Address实体一样,那么JPA会采用默认的访问模式。 这个假设不是随机的。 相反,JPA首先尝试找出@Id批注的位置。 如果在字段上使用@Id批注,则假定为字段访问模式。 如果在getter方法上使用@Id批注,则假定为属性访问模式。 因此,即使在上例中从地址实体中删除@Access批注,映射仍将有效,并且JPA将采用属性访问模式:

@Entity
@Table(name = "tbl_address")
public class Address {private Integer id;private String street;private String city;private String province;private String country;private String postcode;private String transientColumn;@Id@GeneratedValue@Column(name = "address_id")public Integer getId() {return id;}// Rest of the class........

有关访问模式,需要记住的一些重要要点:

  1. 如果使用字段访问模式,则永远不要将字段声明为公共字段。 实体的所有字段都应具有专用 (最佳!), 受保护或默认访问类型。 其背后的原因是,将字段声明为public将允许任何不受保护的类直接访问实体状态,这很容易破坏提供程序的实现。 例如,假设您有一个实体,其所有字段都是公共的。 现在,如果此实体是一个受管实体(这意味着它已保存到数据库中),并且任何其他类都更改了其id的值,然后尝试将所做的更改保存回数据库,则可能会遇到不可预知的行为(在以后的文章中将尝试详细阐述该主题)。 甚至实体类本身也只能在初始化期间直接操作字段(即,在构造函数内部)。
  2. 在属性访问模式下,如果我们将注释应用于setter方法而不是getter方法,则将忽略它们。

也可以将这两种访问类型混合使用。 假设您要对实体的除一种状态外的所有状态都使用字段访问模式,对于其余一种状态,您想使用属性访问模式,因为您想在向/从状态值读取/写入状态值之前执行某种转换。数据库。 您可以按照以下步骤轻松完成此操作:

  1. @Access批注标记实体,并指定AccessType.FIELD作为所有字段的访问方式。
  2. 使用@Transient批注标记您不喜欢使用字段访问模式的字段。
  3. @Access批注标记属性的getter方法,并指定AccessType.PROPERTY作为访问方式。

下面的示例演示了这种方法,因为将邮政编码更改为使用属性访问模式:

@Entity
@Table(name = "tbl_address")
@Access(AccessType.FIELD)
public class Address {@Id@GeneratedValue@Column(name = "address_id")private Integer id;private String street;private String city;private String province;private String country;/*** postcode is now marked as Transient*/@Transientprivate String postcode;@Transientprivate String transientColumn;public Integer getId() {return id;}public Address setId(Integer id) {this.id = id;return this;}public String getStreet() {return street;}public Address setStreet(String street) {this.street = street;return this;}public String getCity() {return city;}public Address setCity(String city) {this.city = city;return this;}public String getProvince() {return province;}public Address setProvince(String province) {this.province = province;return this;}public String getCountry() {return country;}public Address setCountry(String country) {this.country = country;return this;}/*** We are now using property access mode for reading/writing* postcode*/@Access(AccessType.PROPERTY)public String getPostcode() {return postcode;}public Address setPostcode(String postcode) {this.postcode = postcode;return this;}
}

这里要注意的重要一点是,如果我们不使用@Access注释对类进行注释,以将字段访问模式显式指定为默认模式,而是对字段和getter方法进行注释,则映射的结果行为将是不确定的。 这意味着结果将完全取决于持久性提供程序,即一个提供程序可能选择使用字段访问模式作为默认值,一个提供程序可能使用属性访问模式,或者一个可能决定引发异常!

今天就这样。 如果您发现任何问题/有任何疑问,请随时发表评论!

直到下一次。

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

jpa 实体映射视图

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

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

相关文章

今晚课题:2019-3-20

今晚课题C/C万年历技术实现原理上课时间:20:30--22:30上课老师:杰越教育-Larry老师上课地址:https://ke.qq.com/course/353889 课程内容:1、C/Cfor逻辑原理2、重要点数据结构分析3、万年历效果实现展示赢在别人休息时,…

python在材料模拟中的应用_材料模拟python_模拟-python模拟-在不妨碍实现的情况下修补方法...

此答案解决了Quuxplusone用户提供的赏金中提到的其他要求:对于我的用例而言,重要的是它可以与MagicMock一起使用,即,它不需要我在构造Potato(在此示例中为spud)实例与调用spud.foo(在本例中)之间插入任何代码。我需要293984865472…

新版本的Selenium 4 Alpha会有什么期望?

我们所有人都属于测试领域,他们熟悉Selenium,Selenium是业界最流行的开源自动化工具之一。 Selenium的创始成员Simon Stewart在2018年8月正式宣布Selenium 4的发布日期以及它将为用户带来哪些新功能时,我们感到非常兴奋。 与Selenium 3一样&…

今晚课题:2019-3-22

今晚课题数据结构必会重点集合上课时间:20:30--22:30上课老师:杰越教育-Larry老师上课地址:https://ke.qq.com/course/353889 课程内容:1、C/C技术工作运用2、数据结构重点数组定义特点3、工作项目数组合理使用赢在别人休息时&…

java 单例 实现_java 实现单例的各种方式

概述上一篇日志中,我们介绍了单例模式的概念和基础的应用本节中,我们就来介绍一下 java 语言中如何编写单例模式类只适合单线程环境的单例模式public class Singleton {private static Singleton instance null;private Singleton() { }public static S…

Drools DMN最新开源引擎性能改进

我们一直在寻求改善Drools DMN开源引擎的性能。 我们最近审查了DMN用例,其中输入数据节点的实际输入总体有所不同。 这突出显示了引擎的次佳性能,我们在最新版本中对此进行了改进。 我想分享我们的发现! 基准制定 当我们开始为该用例运行一个…

今晚课题:2019-3-23

今晚课题剖析《服务器高并发-IOCP模型架构》上课时间:2019/03/23 20:30--22:30授课讲师:杰越教育C/C学院--Vico课程链接:https://ke.qq.com/course/353889?tuin7472c9c 课程内容: 1、C/C编程语言入门精通 2、C线程技术在服务器…

使用Selenium WebDriver测试自动化的22条实用技巧

使用Selenium进行测试自动化已使全球的网站测试人员能够轻松执行自动化的网站测试。 Webdriver是Selenium框架的核心组件,通过它您可以针对不同类型的浏览器(例如Google Chrome,Mozilla Firefox,Safari,Opera&#xff…

java编译源文件_Java源文件编译示例

java程序编译java源文件JavacCompile文件:package yan.demo.javac;import java.io.File;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import javax.tools.Diagnostic;import javax.tools.DiagnosticCollector;import javax.tools.Fi…

这么奇葩搞笑的代码注释你见过吗

程序员作为一种“异类”,虽然他们平时给人们的留下的印象并不太好,觉得他们只会写代码。但是有的时候不得不佩服他们天马行空的想象力,他们可能会利用注释让你噗嗤一笑,下面我们来看看那些奇葩搞笑的代码注释吧。注释1&#xff1a…

facelets_不要在facelets中重复表情

facelets您是否曾经在JSF中看到过像这样的重复EL表达式&#xff1f; <h:inputText value"#{oneBean.name}" rendered"#{anotherBean.showPerson}"/> <h:inputText value"#{oneBean.birthday}" rendered"#{anotherBean.showPerson…

C语言与Java的深情对话:儿子,还得多练几年啊!老子还是老子

很多小伙伴都老是会碰到疑问&#xff0c;其实还是基础没打扎实&#xff0c;这些题如果你不看答案你能知道多少呢&#xff1f;如果还有很多不知道就证明基础没打扎实&#xff0c;如果你还在入门纠结&#xff0c;如果你还在苦恼怎么入门&#xff01;小编有个建议&#xff0c;可以…

Servlet和JSP之间的区别

JSP和Servlet都是与使用Java构建基于Web的应用程序有关的重要概念。 基本上&#xff0c;Servlet是Java中HTML&#xff0c;而JSP是HTML中的Java。 任何典型的Web开发面试都可能有几个基于JSP和Servlet的Java面试问题 。 尽管JSP和Servlet的主要目的是相同的&#xff0c;但是两者…

BAT人脸识别功能第二步-人脸检测

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

java emptylist_Java之Collections.emptyList()、emptySet()、emptyMap()的作用和好处以及要注意的地方...

先说明一下好处有哪些&#xff1a;1&#xff0c;如果你想 new 一个空的 List &#xff0c;而这个 List 以后也不会再添加元素&#xff0c;那么就用 Collections.emptyList() 好了。new ArrayList() 或者 new LinkedList() 在创建的时候有会有初始大小&#xff0c;多少会占用一内…

java中插入排序实例_java中对插入排序的理解以及实例

一、基本思想通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应的位置并插入。插入排序非常类似于整扑克牌。在开始摸牌时&#xff0c;左手是空的&#xff0c;牌面朝下放在桌上。接着&#xff0c;一次从桌上摸起一张牌&a…

hazelcast入门教程_Hazelcast入门指南第3部分

hazelcast入门教程这是从初学者的角度来看一系列有关如何使用Hazelcast的文章的延续。 如果您还没有阅读最后两个&#xff0c;我鼓励阅读它们&#xff1a; Hazelcast入门指南第1部分 Hazelcast入门指南第2部分 原始人来了 在上一篇文章中&#xff0c;我提到将ILock与IList和…

经典游戏底层框架--迷宫游戏构成原理剖析

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

突破100万年薪《多线程服务器端架构》

今晚课题点击【阅读原文】或长按图片【识别图中的二维码】即可参加今晚的课程。

Java中的观察者设计模式

在本教程中&#xff0c;我们将讨论Observer设计模式。 观察者模式有两个主要方面- 主题和观察者 。 当我们的系统有多个对象&#xff08;称为观察者&#xff09;时 &#xff0c;将使用一个模式&#xff0c;该对象依赖于一个特定对象&#xff08; 主体&#xff09;的状态 。 所…