JPA 2.1如何成为新的EJB 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 (尽管注释属性会很漂亮)
  • @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

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

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

相关文章

常见问题摘要(生活篇)

1 lingoes软件安装了&#xff0c;却没发现怎么取词&#xff1f; 答&#xff1a;在软件设置里面&#xff0c;修改取词模式&#xff0c;一般以鼠标左键按下ctrl 为标准操作。转载于:https://www.cnblogs.com/lastshadow/p/3330146.html

android finish 区别,Android Activity类finish、onDestory和System.exit介绍

image.pngfinish函数Activity.finish()Call this when your activity is done and should be closed.在你的activity动作完成的时候&#xff0c;或者Activity需要关闭的时候&#xff0c;调用此方法。当调用此方法的时候&#xff0c;系统只是将最上面的Activity移出了栈&#xf…

github哪些协议能商用_GitHub 上有哪些一般人也可以用的项目?

​之前有不少粉丝来信询问&#xff1a;能否给初步接触 GitHub 的用户&#xff0c;推荐几个比较实用、容易看懂&#xff0c;无需具备太多专业知识便能上手使用的项目呢&#xff1f;答案是&#xff1a;有的。今天&#xff0c;我们就上述问题&#xff0c;来聊聊 GitHub 上有哪几个…

在JVM中记录世界停顿

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

目睹鸿蒙开创四大至高位面,吞噬星空 绝非鸿蒙系列,完结前最后的分析【申精】...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼先说说空间的划分&#xff1a;第一要说的是空间等级的划分&#xff0c;盘龙里分的很清楚&#xff0c;物质位面&#xff0c;七大神位面&#xff0c;四大至高位面&#xff0c;说得很清楚&#xff0c;物质位面虽然是最低等的位面&…

小程序确定取消弹窗_小程序开发之弹出框

小程序开发过程中&#xff0c;很多地方为了便利我们多采用小程序自带弹出框来实现交互效果。这也够大多数开发使用&#xff0c;下面我给大家详细介绍下小程序弹出框wx.showToast()title&#xff1a;显示的提示信息&#xff0c;在没有图标的情况下&#xff0c;文本内容可显示两行…

jOOQ与Hibernate:何时选择哪个

Hibernate已成为Java生态系统中的事实上的标准&#xff0c;事实上&#xff0c; 如果标准对您很重要 &#xff0c;并且如果您将JCP与ISO&#xff0c;ANSI&#xff0c;IEEE等置于同一级别&#xff0c;那么Hibernate也是实际的JavaEE标准实现。 本文的目的不是讨论标准&#xff0…

【IE6的疯狂之四】IE6文字溢出BUG

在IE6下使用浮动可能会出现文字重复的情况. 在IE6下&#xff0c;浮动层之间有注释文字的话&#xff0c;之前那个浮动层的内容文字就有可能遭遇一个“隐形”的复制&#xff0c;但是代码里查看文字可并没有多出来。 看个例子&#xff1a; XML/HTML代码<!DOCTYPE html PUBLIC ”…

html中左侧播放器插件,简洁实用的html5音乐播放器插件

js代码window.onload function(){MC.music({hasAjax:false,left:50%,bottom:50%,musicChanged:function(ret){// alert(ret.url);// getMusic_buffer(ret.url);// return;var data ret.data;var index ret.index;var imageUrl data[index].img_url;var music_bg document.…

linux怎么才能算telnet成功_怎么表白才算成功呢

要怎样表白才算成功呢&#xff1f;其实如果对方也有点喜欢你的&#xff0c;对你有点感觉的&#xff0c;不管怎样表白&#xff0c;你都会成功的&#xff0c;相反&#xff0c;如果对方本身就对你没感觉的&#xff0c;不管你要怎么轰轰烈烈的表白&#xff0c;你都不会成功。下面&a…

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

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

html js点击字图片下拉,JavaScript实现文字与图片拖拽效果的方法

本文实例讲述了JavaScript实现文字与图片拖拽效果的方法。分享给大家供大家参考。具体实现方法如下&#xff1a;JavaScript实现文字与图片的拖拽效果*{padding:0;margin:0;}.tips{position:absolute;background:#eee;}图片可以拖动脚本之家拖动链接也可以var $idfunction(id){r…

ccf命令行选项只能用c实现_CCF-201403-3-命令行选项

问题描述试题编号&#xff1a;201403-3试题名称&#xff1a;命令行选项时间限制&#xff1a;1.0s内存限制&#xff1a;256.0MB问题描述&#xff1a;问题描述请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格…

python data frame_Python dataframer包_程序模块 - PyPI - Python中文网

数据框尝试将任何文件加载到pandas数据帧中&#xff0c;以最少的配置&#xff0c;关注生物信息学示例通常&#xff0c;您将从磁盘读取文件(open(my-file.txt, rb))。但是字节流在这里更简单。>>> from io import BytesIO>>> from dataframer import datafram…

html设置页面的高度和宽度,web显示页面有图像上设置高度和宽度很重要

因此即使浏览器只有HTML&#xff0c;它仍然能够分配适当的空间。所以我们可以修改成以下内容&#xff1a;最近我们发现谷歌浏览器对图片设置有一定的修改&#xff0c;它主要在图像上进行设置width和设置height属性&#xff0c;以防止布局发生变化并改善网站访问者的体验。Web性…

lsnrctl 与 tnsnames.ora 的联系

平台&#xff1a;Windoxs XPOracle 11G 当使用oralce的 Net Manager创建了一个名为“L3”的Listener后&#xff0c;要想使用lsnrctl启动和关闭 L3 还必须在tnsnames.ora 中配置一个名为L3的条目. listener.ora L3 (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST princess…

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

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

mysql数据库计算全部女生_使用mysql存储过程-统计某个数据库下的所有表的记录数...

使用mysql存储过程-统计某个数据库下的所有表的记录数其中用到了游标(cursor)&#xff0c;循环(loop)&#xff0c;动态SQL预处理(prepare)等技术&#xff0c;特此记录一下。[sql]viewplaincopy1.CREATEPROCEDUREstatis_rows(inv_schemavarchar(50))2.BEGIN3.4.5.DECLAREsql_str…

区县级政府网站群建设要点

区县政府单位虽小&#xff0c;但行政职能齐全&#xff0c;作为服务机构&#xff0c;公民最先接触的也是区县政府&#xff0c;大部分的群众办事在区县里就可以完成&#xff1b;上级政府部门相对于区县来说&#xff0c;管理的职能要高于服务的职能&#xff0c;所以区县对公民的重…

html5 多页面共享数据库,可以跨页面使用HTML5 Web SQL数据库吗?(Can HTML5 Web SQL databases be used across pages?)...

可以跨页面使用HTML5 Web SQL数据库吗&#xff1f;(Can HTML5 Web SQL databases be used across pages?)这可能是一个非常简单的问题&#xff0c;请原谅我的无知&#xff0c;但是可以跨同一个域的页面读取Web SQL数据库吗&#xff1f;例如&#xff0c;如果我在页面上插入数据…