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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jpa语法错误_JPA陷阱/错误

發(fā)布時間:2023/12/3 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa语法错误_JPA陷阱/错误 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

jpa語法錯誤

根據(jù)我在幫助團隊和進行培訓方面的經(jīng)驗,這是我遇到的一些陷阱/錯誤,它們在使用JPA的基于Java的系統(tǒng)中引起了一些問題。

  • 需要一個公共的無參數(shù)構(gòu)造函數(shù)
  • 始終使用雙向關(guān)聯(lián)/關(guān)系
  • 將@OneToMany用于可能龐大的集合

需要一個公共的無參數(shù)構(gòu)造函數(shù)

是的,JPA @Entity需要零參數(shù)(或默認的無參數(shù))構(gòu)造函數(shù)。 但這可以得到protected 您不必將其public 。 這樣就可以實現(xiàn)更好的面向?qū)ο蟮慕?#xff0c;因為您不必強制使用可公開訪問的零參數(shù)構(gòu)造函數(shù)。

實體類必須具有無參數(shù)構(gòu)造函數(shù)。 實體類也可以具有其他構(gòu)造函數(shù)。 no-arg構(gòu)造函數(shù)必須是public 或protected 。 [強調(diào)我的]

–摘自Java Persistence API 2.1規(guī)范(Oracle)的2.1節(jié)

如果要建模的實體在創(chuàng)建時有一些字段需要初始化,則應(yīng)通過其構(gòu)造函數(shù)來完成。

注意:一些JPA提供程序可以通過在構(gòu)建時添加一個無參數(shù)的構(gòu)造函數(shù)來克服缺失的無參數(shù)構(gòu)造函數(shù)。

假設(shè)我們正在建模酒店房間預(yù)訂系統(tǒng)。 在其中,我們可能有諸如房間,預(yù)訂等之類的實體。預(yù)訂實體可能需要開始日期和結(jié)束日期,因為沒有停留時間來創(chuàng)建一個預(yù)訂實體就沒有多大意義。 在保留的構(gòu)造函數(shù)中將開始日期和結(jié)束日期作為參數(shù)包括在內(nèi),將可以提供更好的模型。 保留受保護的零參數(shù)構(gòu)造函數(shù)會使JPA滿意。

@Entity public class Reservation { ...public Reservation(RoomType roomType, DateRange startAndEndDates) {if (roomType == null || startAndEndDates == null) {throw new IllegalArgumentException(...);} ...}...protected Reservation() { /* as required by ORM/JPA */ } }

注意: Hibernate(JPA提供程序)允許將零參數(shù)構(gòu)造函數(shù)設(shè)為私有。 這使您的JPA代碼不可移植到其他JPA提供程序。

它還有助于在零參數(shù)構(gòu)造函數(shù)中添加注釋,以表明它是出于JPA目的(技術(shù)基礎(chǔ)結(jié)構(gòu))而添加的,并且不是域所必需的(業(yè)務(wù)規(guī)則/邏輯)。

盡管我在JPA 2.1規(guī)范中找不到它,但可嵌入類也需要一個默認(無參數(shù))構(gòu)造函數(shù)。 就像實體一樣,可以將必需的無參數(shù)構(gòu)造函數(shù)設(shè)為protected 。

@Embeddable public class DateRange { ...public DateRange(Date start, Date end) {if (start == null || end == null) {throw new IllegalArgumentException(...);}if (start.after(end)) {throw new IllegalArgumentException(...);} ...}...protected DateRange() { /* as required by ORM/JPA */ } }

DDD示例項目還通過將no-arg構(gòu)造函數(shù)設(shè)置為包范圍來隱藏no-arg構(gòu)造函數(shù)(請參閱Cargo實體類,其中no-arg構(gòu)造函數(shù)位于底部附近)。

始終使用雙向關(guān)聯(lián)/關(guān)系

JPA上的教學材料通常顯示出雙向關(guān)聯(lián)。 但這不是必需的。 例如,假設(shè)我們有一個包含一個或多個項目的訂單實體。

@Entity public class Order {@Id private Long id;@OneToMany private List<OrderItem> items;... }@Entity public class OrderItem {@Id private Long id;@ManyToOne private Order order;... }

很高興知道JPA支持雙向關(guān)聯(lián)。 但是實際上,這成為維護的噩夢。 如果訂單項不必知道其父訂單對象,則單向關(guān)聯(lián)就足夠了(如下所示)。 ORM只需要知道如何命名多邊表中的外鍵列。 通過在關(guān)聯(lián)的一側(cè)添加@JoinColumn批注來提供此功能。

@Entity public class Order {@Id Long id;@OneToMany@JoinColumn(name="order_id", ...)private List<OrderItem> items;... }@Entity public class OrderItem {@Id private Long id;// @ManyToOne private Order order;... }

由于OrderItem不再需要保留對Order實體的引用,因此使其變得單向變得更容易。

請注意,有時可能需要雙向關(guān)聯(lián)。 實際上,這種情況很少見。

這是另一個例子。 假設(shè)您有幾個引用國家/地區(qū)實體的實體(例如,人的出生地,郵寄地址等)。 顯然,這些實體將引用國家實體。 但是,國家是否必須引用所有這些不同的實體? 很有可能,不是。

@Entity public class Person {@Id Long id;@ManyToOne private Country countryOfBirth;... }@Entity public class PostalAddress {@Id private Long id;@ManyToOne private Country country;... }@Entity public class Country {@Id ...;// @OneToMany private List<Person> persons;// @OneToMany private List<PostalAddress> addresses; }

所以,僅僅因為JPA支持雙向關(guān)聯(lián), 并不意味著你必須!

使用

假設(shè)您正在建模銀行帳戶及其交易。 隨著時間的流逝,一個帳戶可以進行數(shù)千(甚至數(shù)百萬)筆交易。

@Entity public class Account {@Id Long id;@OneToMany@JoinColumn(name="account_id", ...)private List<AccountTransaction> transactions;... }@Entity public class AccountTransaction {@Id Long id;... }

對于只有少量交易的帳戶,似乎沒有任何問題。 但是隨著時間的流逝,當一個帳戶包含成千上萬個(如果不是上百萬個)交易時,您很可能會遇到內(nèi)存不足的錯誤。 那么,有什么更好的映射方法呢?

如果不能確保關(guān)聯(lián)的多面中的最大元素數(shù)都可以全部加載到內(nèi)存中,則最好在@ManyToOne的另一側(cè)使用@ManyToOne 。

@Entity public class Account {@Id Long id;// @OneToMany private List<AccountTransaction> transactions;... }@Entity public class AccountTransaction {@Id Long id;@ManyToOneprivate Account account;...public AccountTransaction(Account account, ...) {...}protected AccountTransaction() { /* as required by ORM/JPA */ } }

要檢索一個帳戶可能數(shù)千(如果不是幾百萬)的交易,請使用支持分頁的存儲庫。

@Transactional public interface AccountTransactionRepository {Page<AccountTransaction> findByAccount(Long accountId, int offset, int pageSize);... }

要支持分頁,請使用Query對象的setFirstResult(int)和setMaxResults(int)方法。

摘要

我希望這些說明可以幫助開發(fā)人員避免犯這些錯誤。 總結(jié)一下:

  • 要求公眾。 JPA要求的無參數(shù)構(gòu)造函數(shù)可以設(shè)為public或protected 。 如果需要,可以考慮對其進行protected 。
  • 一直使用 考慮單向而不是雙向關(guān)聯(lián)/關(guān)系。
  • 使用 避免使用@OneToMany收集可能龐大的集合。 考慮@ManyToOne映射關(guān)聯(lián)/關(guān)系的@ManyToOne端,并支持分頁。

翻譯自: https://www.javacodegeeks.com/2016/02/jpa-pitfalls-mistakes.html

jpa語法錯誤

總結(jié)

以上是生活随笔為你收集整理的jpa语法错误_JPA陷阱/错误的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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