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

jpa 实体映射视图

在上一篇文章中,我展示了一种持久保存实体的简单方法。 我解释了JPA用于确定实体默认表的默认方法。 假设我们要覆盖此默认名称。 我们之所以喜欢这样做,是因为数据模型是以前设计和修复的,并且表名与我们的类名不匹配(例如,我见过人们创建带有“ tbl_”前缀的表)。 那么我们应该如何覆盖默认表名称以匹配现有数据模型?

事实证明,这非常简单。 如果我们需要覆盖JPA假定的默认表名,则有两种方法可以做到:

  1. 我们可以使用@Entity批注的name属性来提供一个明确的实体名称,以与数据库表名称匹配。 对于我们的示例,如果表名是tbl_address,则可以在Address类中使用@Entity(name =“ tbl_address”)
  2. 我们可以在@Entity批注下面使用@Table (在javax.persistence包中定义)注解,并使用其name属性显式指定表名。
@Entity
@Table(name = "tbl_address")
public class Address {// Rest of the class
}

通过这两种方法,@ Table批注提供了更多用于自定义映射的选项。 例如,某些数据库(例如PostgreSQL)具有schemas概念,您可以使用schemas进一步对表进行分类/分组。 由于此功能,您可以在一个数据库中创建两个具有相同名称的表(尽管它们将属于两个不同的模式)。 要访问这些表,然后在查询中添加架构名称作为表前缀。 因此,如果PostgreSQL数据库有两个不同的模式,分别命名为public (这类似于PostgreSQL数据库的默认模式)和document ,并且这两个模式都包含名为document_collection的表,那么这两个查询都是完全有效的:

-- fetch from the table under public schema
SELECT *
FROM   public.document_collection;-- fetch from the table under document schema
SELECT *
FROM   document.document_collection;

为了将实体映射到文档架构中的document_collection表,您将使用@Table注释,其架构属性设置为document

@Entity
@Table(name="document_collection", schema="document")
public class DocumentCollection {// rest of the class
}

当以这种方式指定时,就像我们在查询中所做的那样,当JPA进入数据库以访问表时,模式名称将作为表名称的前缀添加。

如果不是在@ Table批注中指定架构名称,而是将架构名称附加在表名称本身中,该怎么办?

@Entity
@Table(name = "document.document_collection")
public class DocumentCollection {// rest of the class
}

不能保证以这种方式将模式名称与表名称内联,因为在JPA规范(非标准)中未指定对此名称的支持。 因此,即使您的持久性提供者支持它,也最好不要养成这样做的习惯。

接下来,我们将注意力转移到各列。 为了确定默认列,JPA进行了类似于以下操作:

  1. 首先,它检查是否给出了任何显式的列映射信息。 如果找不到列映射信息,它将尝试猜测列的默认值。
  2. 为了确定默认值,JPA需要知道实体状态的访问类型,即读取/写入实体状态的方式。 在JPA中,两种不同的访问类型是可能的-字段和属性。 在我们的示例中,我们使用了字段访问(实际上,JPA从@Id批注的位置/位置假定了这一点,但稍后会对此进行更多介绍)。 如果您使用此访问类型,则将使用Reflection API从实体字段直接写入/读取状态。
  3. 知道访问类型后,JPA然后尝试确定列名称。 对于字段访问类型,JPA直接将字段名称视为列名称,这意味着如果实体具有名为status的字段,则它将映射到名为status的列。

至此,我们应该很清楚地址实体的状态如何保存到相应的列中。 Address实体的每个字段在数据库表tbl_address中都有一个对应的列,因此JPA将它们直接保存到其对应的列中。 id字段已保存到id列中, city字段已保存到city列中,依此类推。

好的,接下来让我们继续覆盖列名。 据我所知,只有一种方法(如果您碰巧知道任何其他方法,请注释!)可以使用@Column (在javax.persistence包中定义)覆盖实体状态的默认列名称。 )注释。 因此,如果将tbl_address表的id列重命名为address_id,那么我们可以将字段名称更改为address_id ,也可以使用@Column批注将其name属性设置为address_id

@Entity
@Table(name = "tbl_address")
public class Address {@Id@GeneratedValue@Column(name = "address_id")private Integer id;// Rest of the class
}

您可以看到,对于以上所有情况,JPA使用的默认方法都非常明智,大多数情况下您都会对此感到满意。 但是,更改默认值也很容易,并且可以很快完成。

如果我们在地址实体中有一个不希望保存在数据库中的字段怎么办? 假设Address实体有一个名为transientColumn的列,该列在数据库表中没有任何对应的默认列:

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

如果使用上述更改来编译代码,则将出现如下所示的异常:

Exception in thread “main” java.lang.ExceptionInInitializerError
at com.keertimaan.javasamples.jpaexample.Main.main(Main.java:33)
Caused by: javax.persistence.PersistenceException: Unable to build entity manager factory
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:83)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:54)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:39)
at com.keertimaan.javasamples.jpaexample.persistenceutil.PersistenceManager.<init>(PersistenceManager.java:31)
at com.keertimaan.javasamples.jpaexample.persistenceutil.PersistenceManager.<clinit>(PersistenceManager.java:26)
… 1 more
Caused by: org.hibernate.HibernateException: Missing column: transientColumn in jpa_example.tbl_address
at org.hibernate.mapping.Table.validateColumns(Table.java:365)
at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1336)
at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:155)
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:525)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:75)
… 6 more

例外是,持久性提供程序无法在数据库中找到任何名称为transientColumn的列 ,并且我们没有采取任何措施使持久性提供程序明确表示我们不希望将此字段保存在数据库中。 持久性提供程序将其用作实体中映射到数据库列的任何其他字段。

为了解决此问题,我们可以执行以下任一操作:

  1. 我们可以使用@Transient (在javax.persistence包中定义)注解来对transientColumn字段进行注解,以使持久性提供程序知道我们不希望保存该字段,并且该表中没有任何对应的列。
  2. 我们可以使用Java默认具有的transient关键字。

我想到的这两种方法之间的区别在于,如果我们使用transient关键字而不是annotation,则如果Address对象之一从一个JVM序列化到另一个JVM,那么transitionColumn字段将再次被重新初始化(就像Java中的其他任何临时字段)。 对于注释,这不会发生,并且transientColumn字段将在序列化过程中保留其值。 根据经验,如果我不需要担心序列化(在大多数情况下不需要),我总是使用批注。

因此,使用注释,我们可以立即解决问题:

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

今天的人们就这样。 如果发现任何错误/有任何意见,请随时发表评论!

直到下一次。

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

jpa 实体映射视图

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

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

相关文章

java顺序栈和链栈_Java的顺序栈和链式栈

栈的定义栈是限制在表的一段进行插入和删除的运算的线性表&#xff0c;通常能够将插入、删除的一端为栈顶&#xff0c;例外一端称为栈底&#xff0c;当表中没有任何元素的时候称为空栈。通常删除(又称“退栈”)叫做弹出pop操作&#xff0c;每次删除的都是栈顶最新的元素&#x…

Java:ChronicleMap第2部分,超级RAM映射

诸如无处不在的HashMap类的标准Java Map最终受到可用RAM的限制。 阅读本文并了解如何创建几乎无限大小甚至超过目标计算机的RAM大小的Java Map。 内置的Map实现&#xff0c;例如HashMap和ConcurrentHashMap &#xff0c;只要它们相对较小&#xff0c;就可以正常工作。 在所有情…

jsp中的java部分_jsp页面的七个组成部分

jsp页面的七个组成部分1. 静态内容&#xff1a;前端内容一行一行翻译成 out.write(“前端内容”);2. 指令&#xff1a; 第一个指令是pagepage指令的第一个标准用法&#xff0c;告诉servlet容器&#xff0c;这是一个jsp页面pageEncoding 指…

java多线程做一件事_关于Java的十件事

java多线程做一件事那么&#xff0c;您从一开始就一直在使用Java&#xff1f; 还记得那些被称为“ Oak”的日子&#xff0c;OO仍然是热门话题&#xff0c;C 人士认为Java没有机会&#xff0c;Applet还是一件事吗&#xff1f; 我敢打赌&#xff0c;您至少不了解以下一半内容。 …

java第二章复习_JAVA第二章知识点

JAVA第二章知识点本章知识梳理2.1 关键字2.2 标识符2.3 变 量2.4运算符2.5 程序流程控制2.6 方法2.1 关键字关键字(keyword)的定义和特点定义&#xff1a;被java语言赋予了特殊含义&#xff0c;用做专门用途的字符串(单词)特点&#xff1a;关键字中所有字母都为小写保留字(rese…

打造大型直播平台之《PC客户端架构》

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

Java中的装饰器设计模式

装饰器设计模式允许在运行时将附加职责或行为动态附加到对象。 它是一种结构模式&#xff0c;利用聚合来组合这些行为。 在本教程中&#xff0c;我们将学习实现装饰器模式。 UML图&#xff1a; 让我们从装饰器模式的UML表示开始&#xff1a; ConcreteComponent类是我们希望为…

冲击波病毒攻击-《截获网站服务器数据》

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

java版 modbus crc16校验 (已测试成功)_java版 ModBus CRC16校验 (已测试成功)

ModBus 的Crc16校验package testCase;public class CRC16M {static final String HEXES "0123456789ABCDEF";byte uchCRCHi (byte) 0xFF;byte uchCRCLo (byte) 0xFF;private static byte[] auchCRCHi { 0x00, (byte) 0xC1, (byte) 0x81, (byte) 0x40, (byte) 0x0…

用户控件 自定义控件_新的自定义控件:TaskProgressView

用户控件 自定义控件我已经编写了一个新的自定义控件&#xff0c;并将其提交到ControlsFX项目。 这是一个高度专业的控件&#xff0c;用于显示后台任务&#xff0c;其当前状态和进度的列表。 这实际上是我为ControlsFX编写的第一个控件&#xff0c;只是出于乐趣的考虑&#xff…

C/C++码农到工程师进化之路

今晚课题长按图片【识别图中的二维码】

java菜鸟到cto 图_从菜鸟到入门,掌握 Log4j

1 简介Log4j(log for java)是Apache的一个开源项目&#xff0c;通过使用Log4j&#xff0c;我们可以控制日志信息输送的目的地是控制台、文件、GUI组件&#xff0c;甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等&#xff1b;我们也可以控制每一条日志的输出格式&a…

Java中的复合设计模式

当我们必须使用对象的树状分层结构时&#xff0c;复合设计模式非常有用。 它使我们能够统一对待单个对象和对象的组成。 它属于结构设计模式的范畴&#xff0c;因为它将对象组合成树形结构以表示部分整个层次结构。 UML表示形式&#xff1a; 复合模式的UML表示形式如下&#…

腾讯官方游戏《陆战之王 3D坦克大战》

今晚课题长按图片【识别图中的二维码】

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

hazelcast入门教程这是我的Hazelcast系列的第四部分。 如果一个人没有看到其他三个人&#xff0c;我建议一个人去看第1 部分 &#xff0c; 第2 部分和第3部分 。 记录中 日志记录是任何应用程序的重要功能&#xff0c;我的示例也是如此。 System.out.println可以用作告诉用户控…

《地下城与勇士歼灭贝内尔》回合格斗

今晚课题长按图片【识别图中的二维码】

java继承执行子类输出顺序_JAVA继承顺序

当使用继承这个特性时&#xff0c;程序是如何执行的&#xff1b;继承的初始化顺序1.初始化父类再初始子类2.先执行初始化对象中属性&#xff0c;再执行构造方法中的初始化当使用继承这个特性时&#xff0c;程序是如何执行的呢&#xff0c;也就是说我们需要关注继承的初始化顺序…

空字符串字符串不为空_当字符串为空但不为空时

空字符串字符串不为空介绍 我团队中的一名初级程序员遇到了一个有趣的错误。 我已经不止一次看到它的症状。 这篇文章是寻找什么以及如何在将来防止它。 我还将探讨该问题的不同解决方案。 病征 有问题的代码看起来做得不错。&#xff1a; if(trouble ! null && !tro…

网络通信协议-TCP/IP模型实战

今晚课题长按图片【识别图中的二维码】

java家具网站需求分析_基于jsp的家具销售-JavaEE实现家具销售 - java项目源码

基于jspservletpojomysql实现一个javaee/javaweb的家具销售, 该项目可用各类java课程设计大作业中, 家具销售的系统架构分为前后台两部分, 最终实现在线上进行家具销售各项功能,实现了诸如用户管理, 登录注册, 权限管理等功能, 并实现对各类家具销售相关的实体进行管理。该家具…