1.0jpa 2.0_JPA 2.1如何成为新的EJB 2.0

1.0jpa 2.0

美丽在于情人眼中。 “轻松”也是如此:

了解有关SQL结果集映射的更多信息,并轻松处理本机查询结果: http : //t.co/WH4BTlClIP #JPA #Java #JavaEE

— Thorben Janssen(@ thjanssen123) 2015年4月15日

Thorben写了关于JPA的非常有用的文章 ,最近他开始撰写有关JPA 2.1的新功能的精彩系列文章。 其中:结果集映射。 您可能从CTMMC或annotatiomania.com等网站知道结果集映射。 我们可以将映射过程总结如下:

a)定义映射

@SqlResultSetMapping(name = "BookAuthorMapping",entities = {@EntityResult(entityClass = Book.class,fields = {@FieldResult(name = "id", column = "id"),@FieldResult(name = "title", column = "title"),@FieldResult(name = "author", column = "author_id"),@FieldResult(name = "version", column = "version")}),@EntityResult(entityClass = Author.class,fields = {@FieldResult(name = "id", column = "authorId"),@FieldResult(name = "firstName", column = "firstName"),@FieldResult(name = "lastName", column = "lastName"),@FieldResult(name = "version", column = "authorVersion")})})

上面的映射相当简单。 它指定如何将数据库列映射到实体字段和整个实体。 然后,为该映射指定一个名称( "BookAuthorMapping" ),然后可以在整个应用程序中重用该名称,例如,使用本机JPA查询。

我特别喜欢Thorben随后写道:

如果您不希望在实体中添加如此庞大的批注,也可以在XML文件中定义映射

…因此,我们回到了用大量XML替换大量注释的技术–我们中的许多人都希望避免使用注释的技术…:-)

b)应用映射

在某些Java类型上静态定义了映射后,您就可以通过应用上述BookAuthorMapping来获取这些实体

List<Object[]> results = this.em.createNativeQuery("SELECT b.id, b.title, b.author_id, b.version, " +"       a.id as authorId, a.firstName, a.lastName, " + "       a.version as authorVersion " + "FROM Book b " +"JOIN Author a ON b.author_id = a.id", "BookAuthorMapping"
).getResultList();results.stream().forEach((record) -> {Book book = (Book)record[0];Author author = (Author)record[1];
});

请注意,您仍然需要记住BookAuthor类型并显式转换,因为没有可验证的类型信息真正附加到任何东西上。

“复杂”的定义

现在,该文章声称这是“复杂”映射,毫无疑问,我会同意。 如果您想通过JPA真正映射您的实体,那么只有一个简单联接的非常简单的查询已经触发了此类注释混乱。 一旦查询变得更加复杂,您就不想看到Thorben的映射注释。 记住,@ @SqlResultSetMapping是关于映射(本机!)SQL结果的,所以我们不再处于对象图持久化领域,而是进入SQL领域 ,在该领域进行批量获取,非规范化,聚合和其他“奇特” SQL东西为王。

问题在这里:

Java 5引入了注释。 注释最初打算用作“人工修饰符”,即诸如staticfinalprotected类的东西(有趣的是, 锡兰只知道注释,没有修饰符 )。 这是有道理的。 Java语言设计人员可以在不破坏现有代码的情况下引入新的修饰符/“关键字”,因为“真实”关键字是保留字,很难在语言中引入。 还记得enum吗?

因此,注释的好用例(而且很少)是:

  • @Override
  • @Deprecated (尽管,comment属性会很漂亮)
  • @FunctionalInterface

JPA(以及其他Java EE API以及Spring)在使用注解方面一无所知。 在我之后重复:

在Java之前或之后,没有一种语言像Java那样滥用注释。

阅读以上内容时,我的内心深处很强烈。 您还记得以下内容吗?

在Java之前或之后,没有任何一种语言比Java滥用过检查异常。

到2020年,我们都会深表遗憾。

注释是Java类型系统中的一大障碍。 它们的合理使用极为有限,而我们Java Enterprise开发人员如今所做的事情绝对不在“合理”的范围内。 我们正在滥用它们来配置某些我们本该为之编写代码的东西。

这是使用jOOQ (或任何其他利用SQL的泛型和类型安全性的API)运行相同查询的方式:

Book b = BOOK.as("b");
Author a = AUTHOR.as("a");DSL.using(configuration).select(b.ID, b.TITLE, b.AUTHOR_ID, b.VERSION,a.ID, a.FIRST_NAME, a.LAST_NAME,a.VERSION).from(b).join(a).on(b.AUTHOR_ID.eq(a.ID)).fetch().forEach(record -> {BookRecord book = record.into(b);AuthorRecord author = record.into(a);});

此示例结合了JPA 2.1的注释和查询。 有关计划的“实体”的所有元信息已经包含在查询中,因此也包含在fetch()方法产生的Result中。 但这并不重要,关键是这个lambda表达式……

record -> {BookRecord book = record.into(b);AuthorRecord author = record.into(a);
}

……可以是您想要的任何东西! 就像我们在以前的博客文章中显示的更复杂的示例一样:

  • 不再需要ORM
  • 使用jOOQ和JavaFX将SQL数据转换为图表

可以使用函数即时定义映射。 函数是理想的映射器,因为它们接受输入,产生输出并且完全无状态。 关于Java 8中功能的最好之处在于,它们是由Java编译器编译的,可用于对映射进行类型检查。 当给定的映射算法可以使用多次时,您可以将函数分配给对象,从而可以重用这些函数。

实际上,SQL SELECT子句本身就是这样的功能。 将输入元组/行转换为输出元组/行的函数,您可以使用其他表达式即时调整该函数。

在前面的JPA 2.1本机SQL语句和@SqlResultSetMapping示例中,绝对没有任何类型可以进行类型检查。 想象一下更改列名:

List<Object[]> results = this.em.createNativeQuery("SELECT b.id, b.title as book_title, " +"       b.author_id, b.version, " +"       a.id as authorId, a.firstName, a.lastName, " + "       a.version as authorVersion " + "FROM Book b " +"JOIN Author a ON b.author_id = a.id", "BookAuthorMapping"
).getResultList();

您注意到差异了吗? b.title列已重命名为book_title 。 在SQL字符串中。 在运行时会爆炸! 如何记住你也必须适应

@FieldResult(name = "title", column = "title")

… 成为

@FieldResult(name = "title", column = "book_title")

相反,如何记住,一旦在@FieldResult重命名了column ,就还必须检查使用此"BookAuthorMapping"位置,并还要更改那些查询中的列名称。

@SqlResultSetMapping(name = "BookAuthorMapping",...
)

注解是邪恶的

您可能同意或不同意以上某些内容。 您可能喜欢jOOQ,也可能不喜欢jOOQ ,这是完全可以的。 但是,很难不同意以下事实:

  • Java 5引入了非常有用的注释
  • Java EE / Spring严重滥用了这些注释来替换XML
  • 现在,我们有了Java中的并行Universe类型系统
  • 该并行Universe类型系统完全没有用,因为编译器无法对其进行自省
  • Java SE 8引入了函数式编程和许多类型推断
  • Java SE 9-10将引入更多很棒的语言功能
  • 现在很清楚,配置(XML或注释)应该首先是代码
  • JPA 2.1已成为新的EJB 2.0:已过时

就像我说的。 很难不同意。 换句话说:

代码在表达算法方面比配置好得多

我在会议上多次亲自见过Thorben。 Thorben :-)这里的这句话并不是个人意思,-)您有关JPA的文章非常有趣。 如果您的读者正在使用JPA,请查看Thorben的博客: http : //www.thoughts-on-java.org 。

同时,我很想提名Thorben为受人尊敬的头衔“ 2015年度注释狂”

翻译自: https://www.javacodegeeks.com/2015/04/how-jpa-2-1-has-become-the-new-ejb-2-0.html

1.0jpa 2.0

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

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

相关文章

C语言while循环要点你会吗

点击上方蓝字关注我&#xff0c;了解更多咨询while语句在使用过程需要注意几个要点&#xff1a;一、无限循环先来看看以下的代码示例int n 0;while(n<3)printf("n %d", n);n;执行代码后&#xff0c;循环输出n0。在上述代码中&#xff0c;虽然有n自增&#xff0c…

mysql performance tuning_MySQL Performance tuning

1.表级锁状态mysql> show status like table%;---------------------------------------| Variable_name | Value |---------------------------------------| Table_locks_immediate | 139306577 || Table_locks_waited | 0 || Tabl…

序列化加密字段_自动加密可序列化的类

序列化加密字段在Coursera安全顶峰项目的验尸讨论中提出了一个疯狂的想法。 类可以在序列化期间自行加密吗&#xff1f; 这主要是学术上的“假设”练习。 很难想到这样一种情况&#xff0c;我们希望在持久性期间依靠对象自加密而不是使用显式加密机制。 我只能确定一种情况&am…

C语言if与else匹配规则你知道多少?

点击上方蓝字关注我&#xff0c;了解更多咨询如果程序中有多个if和else&#xff0c;那如何配对&#xff0c;if和else的匹配规则简单总结为以下两点&#xff1a;1.无花括号&#xff0c;else和最近的if匹配2.有花括号&#xff0c;else和内含有if语句的第1个if语句匹配我们通过两个…

cobertura_Cobertura和Sonar 5.1的问题

cobertura最近&#xff0c;我有些麻烦&#xff0c;试图在我的Grails 2.4.4项目中使用Sonar 5.1。 我使用的是Groovy常用的东西&#xff1a; Gmetrics&#xff0c;Codenarc和Cobertura 。 对于Sonar数据库&#xff0c;我使用的是Postgres 9.4 。 声纳跑步者的日志文件给了我这个…

C语言中+=的含义你明白吗?

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中是代表两个变量相加&#xff0c;并将答案记录在左边的变量里。比如xy实际代表的表达式为&#xff1a;xxy。这是c语言为了语言的简洁性推出的组合运算。常见的运算符都可以这样组合运算。一、源码演示&#xff1a;二、输出结果…

calcite mysql_Apache顶级项目 Calcite使用介绍

原标题&#xff1a;Apache顶级项目 Calcite使用介绍什么是CalciteApache Calcite是一个动态数据管理框架&#xff0c;它具备很多典型数据库管理系统的功能&#xff0c;比如SQL解析、SQL校验、SQL查询优化、SQL生成以及数据连接查询等&#xff0c;但是又省略了一些关键的功能&am…

C语言中「」的含义

点击上方蓝字关注我&#xff0c;了解更多咨询取决于在scanf中使用还是在printf中使用。在scanf中使用&#xff0c;则添加了*的部分会被忽略&#xff0c;不会被参数获取。例如&#xff1a;int a,b;char b[10];scanf("%d%*s",&a,b)&#xff1b;输入为&#xff1a;1…

maven和docker_Java EE,Docker和Maven(技术提示#89)

maven和dockerJava EE应用程序通常使用Maven构建和打包。 例如&#xff0c; github.com/javaee-samples/javaee7-docker-maven是一个琐碎的Java EE 7应用程序&#xff0c;它显示了Java EE 7依赖性&#xff1a; <dependencies><dependency><groupId>javax<…

mysql ondumplictcate_4.5万字手把手教你实现MySQL TB级数据存储!!

写在前面业界对系统的高可用有着基本的要求&#xff0c;简单的说&#xff0c;这些要求可以总结为如下所示。系统架构中不存在单点问题。可以最大限度的保障服务的可用性。一般情况下系统的高可用可以用几个9来评估。所谓的几个9就是系统可以保证对外提供的服务的时间达到总时间…

c语言中+ =和=+有什么区别

点击上方蓝字关注我&#xff0c;了解更多咨询c语言中 和有什么区别&#xff1a;区别在于 是简写&#xff0c;a 1就是a a1&#xff1a;并不是简写&#xff0c;a a直接对a的赋值&#xff0c;符号代表的是正负&#xff08;完全可以省略不写&#xff09;&#xff0c;即a b其实就…

jvm7 jvm8_我们真的仍然需要32位JVM吗?

jvm7 jvm8即使在今天&#xff08;2015年&#xff09;&#xff0c;我们仍然有两个版本或Oracle HotSpot JDK –已调整为32或64位体系结构。 问题是我们是否真的想在服务器甚至笔记本电脑上使用32位JVM&#xff1f; 我们应该有很受欢迎的意见&#xff01; 如果只需要较小的堆&…

C语言中的printf函数,你觉得它简单吗?

点击上方蓝字关注我&#xff0c;了解更多咨询什么是printf函数&#xff1f;printf函数是C语言当中的输出函数&#xff0c;是用来将内容显示在屏幕上的&#xff0c;是C库中的一种函数。printf函数的用法printf函数使用起来很简单&#xff0c;格式&#xff1a;printf&#xff08;…

tp5怎么生成短链接_请问在tp5中怎样才能使用url函数?

MM们thinkphp中的自动完成函数调用有两种不同的方法&#xff0c;分别为callback与function;12345678910namespace Home\Model;use Think\Model;class UserModel extends Model{protected $_auto array (array(status,1), // 新增的时候把status字段设置为1array(password,md5,…

cuba 平台_CUBA平台的理念

cuba 平台最近发生了很多事。 在CUBA于6月1日正式发布之后&#xff0c;我们推出了新版本&#xff0c;在一些Java网站上发布了我们的第一篇文章&#xff0c;并在伦敦的Devoxx UK会议上介绍了该平台 。 但是在热潮继续之前&#xff0c;大约是时候阐明CUBA背后的哲学了。 与企业软…

C语言进阶:探讨函数指针的的定义与使用

点击上方蓝字关注我&#xff0c;了解更多咨询函数指针今天准备和大家讲解一下我们C语言编程的函数指针&#xff0c;为什么函数也需要指针呢&#xff1f;我是这样理解的函数指针方便我们对函数的调用&#xff0c;当我们需要把一个函数作为参数传给其他参数的时候就必须使用函数指…

jvm gc停顿_在JVM中记录世界停顿

jvm gc停顿不同的事件可能导致JVM暂停所有应用程序线程。 这种暂停称为世界停止&#xff08;STW&#xff09;暂停。 触发STW暂停的最常见原因是垃圾回收&#xff08; 例如github中的示例 &#xff09;&#xff0c;但是不同的JIT操作&#xff08; 示例 &#xff09;&#xff0c;…

-在c语言中什么含义

点击上方蓝字关注我&#xff0c;了解更多咨询->是一个整体&#xff0c;它是用于指向结构体。1.换种说法&#xff0c;如果我们在C语言中定义了一个结构体&#xff0c;然后申明一个指针指向这个结构体&#xff0c;那么我们要用指针取出结构体中的数据&#xff0c;就要用到“-&…

idea如何连接本地mysql_IDEA如何连接MYSQL

IDEA如何连接MYSQL1>下载JDBC2>导入数据库驱动在IDEA中新建一个lib目录复制下载的驱动包&#xff0c;然后粘贴到刚刚建立的lib目录下右键点击添加的数据库驱动&#xff0c;找到最下面的Add as Library...&#xff0c;点击它会出现一个弹窗&#xff0c;点击"OK"…

apache camel_Apache Camel日志组件示例

apache camelApache Camel日志组件示例 您要将消息记录到底层的记录机制中&#xff0c;请使用骆驼的log:组件。 Camel使用sfl4j作为记录器API&#xff0c;然后允许您配置记录器实现。 在本文中&#xff0c;我们将使用Log4j作为实际的记录器机制。 让我们从我们的例子开始。 依…