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 实体映射视图

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

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

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

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

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

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

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

  4. 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 ...

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

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

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

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

  7. SpringBoot注解把配置文件自动映射到属性和实体类实战

    SpringBoot注解把配置文件自动映射到属性和实体类实战 简介:讲解使用@value注解配置文件自动映射到属性和实体类 1.配置文件加载 方式一 1.Controller上面配置 @Propert ...

  8. java实体类没有映射文件_MyBatis自动生成实体类、DAO和XML映射文件,并去掉实体类中的getter和setter方法...

    今天花了3个多小时搞定了这个事情,写个Blog记录一下,先看一下最终生成的实体类吧. packagecom.mybatis.pojo;importlombok.AllArgsConstructor;i ...

  9. mysql jpa 批注 视图_JPA 批注参考

    在 JPA 之前,Java EE 应用程序将持续类表示为容器管理的实体 bean.使用 JPA,您可以将任何普通的旧式 Java 对象 (POJO) 类指定为 JPA 实体:一个应使用 JPA 持续性 ...

最新文章

  1. 重上热搜!北师大教授:给非洲留学生1年10万奖学金真的不算多!
  2. git reset --hard HEAD
  3. ZooKeeper安装及配置(Windows系统下)
  4. IO:同步,异步,阻塞,非阻塞
  5. spring cloud gateway的stripPrefix配置
  6. 【渝粤教育】国家开放大学2018年春季 0688-21T老年精神障碍护理 参考试题
  7. leetcode106. 从中序与后序遍历序列构造二叉树(dfs)
  8. 关于malloc与字符指针的一些易错点
  9. 建模师分类:选择游戏还是工业?哪个发展前景更好?
  10. ubuntu14.04-安装flash
  11. Qt:利用telnet连接PMAC
  12. 达达开放平台php,达达开放平台对接
  13. 文件粉碎机c语言代码,VB写文件粉碎机
  14. 慢慢的,就没有了,就像从未存在过
  15. 163邮箱格式 ,个人邮箱的正确格式
  16. 如何部署软件 - 让你团队的部署像地狱一样无聊且毫无压力
  17. Bert:Pre-training of Deep Bidirectional Transformers forLanguage Understanding
  18. 为Excel工作表单元格命名的两种方法
  19. 伊云谷数字科技 首家登兴柜的云端数字服务公司
  20. GEF原理及实现系列(一、GEF概述)

热门文章

  1. P2354,jzoj3757-[NOI2014]随机数生成器【贪心,暴力】
  2. 【jzoj】2018.1.30NOIP普及组——模拟赛D组
  3. 简单多边形三角化(暴力)
  4. 洛谷-P3396 哈希冲突 分块
  5. Spring Boot 消息队列 RocketMQ 入门
  6. 搞定所有的跨域请求问题
  7. 汇编语言(二十)之分类统计字符个数
  8. Java最小堆解决TopK问题
  9. Java数据库连接池--DBCP浅析
  10. Tomcat解决HTTP GET中文乱码