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

在上一篇文章中,我展示了两种读取/写入持久实体状态的不同方法-字段和属性。 使用字段访问模式时,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批注,则假定为属性访问模式。 因此,即使我们在上面的示例中从Address实体中删除了@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

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

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

相关文章

uniAPP小程序 子组件使用watch不生效,H5正常,小程序不正常(其实是子组件model选项的问题)

第一次用 uniapp 写小程序,还是遇到挺多问题的。写了一个下拉多选组件,发现同样的代码,在H5上运行效果正常,在小程序上压根不走 watch 。 uniapp官网:【全局配置 | uni-app官网】 看文档 watch 是支持H5、小程序的&…

jQuery EasyUI/TopJUI创建日期时间输入框

jQuery EasyUI/TopJUI创建日期时间输入框 日期时间输入框组件 HTML 和日期输入框类似&#xff0c;日期时间输入框允许用户选择日期和指定的时间并按照指定的输出格式显示。相比日期输入框&#xff0c;它在下拉面板中添加了一个时间微调器。 <div class"topjui-containe…

使用oracle 的 PL/Sql 定时执行一个存储过程

/*使用oracle 的 PL/Sql 定时执行一个存储过程 测试目的&#xff1a;在表 tab 中间隔一分钟插入一条数据 实现方案&#xff1a;1.通过 oracle 中 dbms_job 完成存储过程的定时调用2.在存储过程中完成相应的逻辑操作 脚本说名&#xff1a;以下代码为 dbms_job 操作的基本写法&am…

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

在本文中&#xff0c;我将讨论JPA中的实体映射过程。 至于我的示例&#xff0c;我将使用与 我以前的一篇文章中使用的模式相同的模式 。 在前两篇文章中&#xff0c;我解释了如何在Java SE环境中设置JPA。 我不打算为Web应用程序编写安装过程&#xff0c;因为Web上的大多数教程…

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]"><…