日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1.0jpa 2.0_JPA 2.1如何成为新的EJB 2.0 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.0jpa 2.0

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

了解有關(guān)SQL結(jié)果集映射的更多信息,并輕松處理本機(jī)查詢結(jié)果: http : //t.co/WH4BTlClIP #JPA #Java #JavaEE

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

Thorben寫(xiě)了關(guān)于JPA的非常有用的文章 ,最近他開(kāi)始撰寫(xiě)有關(guān)JPA 2.1的新功能的精彩系列文章。 其中:結(jié)果集映射。 您可能從CTMMC或annotatiomania.com等網(wǎng)站知道結(jié)果集映射。 我們可以將映射過(guò)程總結(jié)如下:

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")})})

上面的映射相當(dāng)簡(jiǎn)單。 它指定如何將數(shù)據(jù)庫(kù)列映射到實(shí)體字段和整個(gè)實(shí)體。 然后,為該映射指定一個(gè)名稱( "BookAuthorMapping" ),然后可以在整個(gè)應(yīng)用程序中重用該名稱,例如,使用本機(jī)JPA查詢。

我特別喜歡Thorben隨后寫(xiě)道:

如果您不希望在實(shí)體中添加如此龐大的批注,也可以在XML文件中定義映射

…因此,我們回到了用大量XML替換大量注釋的技術(shù)–我們中的許多人都希望避免使用注釋的技術(shù)…:-)

b)應(yīng)用映射

在某些Java類型上靜態(tài)定義了映射后,您就可以通過(guò)應(yīng)用上述BookAuthorMapping來(lái)獲取這些實(shí)體

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]; });

請(qǐng)注意,您仍然需要記住Book和Author類型并顯式轉(zhuǎn)換,因?yàn)闆](méi)有可驗(yàn)證的類型信息真正附加到任何東西上。

“復(fù)雜”的定義

現(xiàn)在,該文章聲稱這是“復(fù)雜”映射,毫無(wú)疑問(wèn),我會(huì)同意。 如果您想通過(guò)JPA真正映射您的實(shí)體,那么只有一個(gè)簡(jiǎn)單聯(lián)接的非常簡(jiǎn)單的查詢已經(jīng)觸發(fā)了此類注釋混亂。 一旦查詢變得更加復(fù)雜,您就不想看到Thorben的映射注釋。 記住,@ @SqlResultSetMapping是關(guān)于映射(本機(jī)!)SQL結(jié)果的,所以我們不再處于對(duì)象圖持久化領(lǐng)域,而是進(jìn)入SQL領(lǐng)域 ,在該領(lǐng)域進(jìn)行批量獲取,非規(guī)范化,聚合和其他“奇特” SQL東西為王。

問(wèn)題在這里:

Java 5引入了注釋。 注釋最初打算用作“人工修飾符”,即諸如static , final , protected類的東西(有趣的是, 錫蘭只知道注釋,沒(méi)有修飾符 )。 這是有道理的。 Java語(yǔ)言設(shè)計(jì)人員可以在不破壞現(xiàn)有代碼的情況下引入新的修飾符/“關(guān)鍵字”,因?yàn)椤罢鎸?shí)”關(guān)鍵字是保留字,很難在語(yǔ)言中引入。 還記得enum嗎?

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

  • @Override
  • @Deprecated (盡管,comment屬性會(huì)很漂亮)
  • @FunctionalInterface

JPA(以及其他Java EE API以及Spring)在使用注解方面一無(wú)所知。 在我之后重復(fù):

在Java之前或之后,沒(méi)有一種語(yǔ)言像Java那樣濫用注釋。

閱讀以上內(nèi)容時(shí),我的內(nèi)心深處很強(qiáng)烈。 您還記得以下內(nèi)容嗎?

在Java之前或之后,沒(méi)有任何一種語(yǔ)言比Java濫用過(guò)檢查異常。

到2020年,我們都會(huì)深表遺憾。

注釋是Java類型系統(tǒng)中的一大障礙。 它們的合理使用極為有限,而我們Java Enterprise開(kāi)發(fā)人員如今所做的事情絕對(duì)不在“合理”的范圍內(nèi)。 我們正在濫用它們來(lái)配置某些我們本該為之編寫(xiě)代碼的東西。

這是使用jOOQ (或任何其他利用SQL的泛型和類型安全性的API)運(yùn)行相同查詢的方式:

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);});

此示例結(jié)合了JPA 2.1的注釋和查詢。 有關(guān)計(jì)劃的“實(shí)體”的所有元信息已經(jīng)包含在查詢中,因此也包含在fetch()方法產(chǎn)生的Result中。 但這并不重要,關(guān)鍵是這個(gè)lambda表達(dá)式……

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

……可以是您想要的任何東西! 就像我們?cè)谝郧暗牟┛臀恼轮酗@示的更復(fù)雜的示例一樣:

  • 不再需要ORM
  • 使用jOOQ和JavaFX將SQL數(shù)據(jù)轉(zhuǎn)換為圖表

可以使用函數(shù)即時(shí)定義映射。 函數(shù)是理想的映射器,因?yàn)樗鼈兘邮茌斎?#xff0c;產(chǎn)生輸出并且完全無(wú)狀態(tài)。 關(guān)于Java 8中功能的最好之處在于,它們是由Java編譯器編譯的,可用于對(duì)映射進(jìn)行類型檢查。 當(dāng)給定的映射算法可以使用多次時(shí),您可以將函數(shù)分配給對(duì)象,從而可以重用這些函數(shù)。

實(shí)際上,SQL SELECT子句本身就是這樣的功能。 將輸入元組/行轉(zhuǎn)換為輸出元組/行的函數(shù),您可以使用其他表達(dá)式即時(shí)調(diào)整該函數(shù)。

在前面的JPA 2.1本機(jī)SQL語(yǔ)句和@SqlResultSetMapping示例中,絕對(duì)沒(méi)有任何類型可以進(jìn)行類型檢查。 想象一下更改列名:

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字符串中。 在運(yùn)行時(shí)會(huì)爆炸! 如何記住你也必須適應(yīng)

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

… 成為

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

相反,如何記住,一旦在@FieldResult重命名了column ,就還必須檢查使用此"BookAuthorMapping"位置,并還要更改那些查詢中的列名稱。

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

注解是邪惡的

您可能同意或不同意以上某些內(nèi)容。 您可能喜歡jOOQ,也可能不喜歡jOOQ ,這是完全可以的。 但是,很難不同意以下事實(shí):

  • Java 5引入了非常有用的注釋
  • Java EE / Spring嚴(yán)重濫用了這些注釋來(lái)替換XML
  • 現(xiàn)在,我們有了Java中的并行Universe類型系統(tǒng)
  • 該并行Universe類型系統(tǒng)完全沒(méi)有用,因?yàn)榫幾g器無(wú)法對(duì)其進(jìn)行自省
  • Java SE 8引入了函數(shù)式編程和許多類型推斷
  • Java SE 9-10將引入更多很棒的語(yǔ)言功能
  • 現(xiàn)在很清楚,配置(XML或注釋)應(yīng)該首先是代碼
  • JPA 2.1已成為新的EJB 2.0:已過(guò)時(shí)

就像我說(shuō)的。 很難不同意。 換句話說(shuō):

代碼在表達(dá)算法方面比配置好得多

我在會(huì)議上多次親自見(jiàn)過(guò)Thorben。 Thorben :-)這里的這句話并不是個(gè)人意思,-)您有關(guān)JPA的文章非常有趣。 如果您的讀者正在使用JPA,請(qǐng)查看Thorben的博客: http : //www.thoughts-on-java.org 。

同時(shí),我很想提名Thorben為受人尊敬的頭銜“ 2015年度注釋狂”

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

1.0jpa 2.0

總結(jié)

以上是生活随笔為你收集整理的1.0jpa 2.0_JPA 2.1如何成为新的EJB 2.0的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。