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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jpa 实体映射视图_JPA教程:实体映射-第3部分 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

jpa 實體映射視圖

在上一篇文章中,我展示了兩種讀取/寫入持久實體狀態的不同方法-字段和屬性。 使用字段訪問模式時,JPA使用反射直接從實體的字段讀取狀態值。 如果我們沒有明確指定列名,它將直接將字段名轉換為數據庫列名。 在屬性訪問模式下,getter / setter方法用于讀取/寫入狀態值。 在這種情況下,我們使用相同的注釋來注釋實體狀態的getter方法,而不是字段。 如果我們未明確指定數據庫列名稱,則按照JavaBean約定確定它們,即通過從getter方法名稱中刪除“ get”部分并將方法名稱其余部分的首字母轉換為小寫字符來確定。


我們可以通過在實體類聲明中使用@Access注釋來指定用于實體的訪問方式。 此注釋采用AccessType類型的參數(在javax.persistence包中定義)枚舉,該參數具有對應于兩種不同訪問模式( FIELD和PROPERTY )的兩個不同值。 例如,我們可以通過以下方式為Address實體指定屬性訪問模式:

@Entity @Table(name = "tbl_address") @Access(AccessType.PROPERTY) public class Address {private Integer id;private String street;private String city;private String province;private String country;private String postcode;private String transientColumn;@Id@GeneratedValue@Column(name = "address_id")public Integer getId() {return id;}public Address setId(Integer id) {this.id = id;return this;}public String getStreet() {return street;}public Address setStreet(String street) {this.street = street;return this;}public String getCity() {return city;}public Address setCity(String city) {this.city = city;return this;}public String getProvince() {return province;}public Address setProvince(String province) {this.province = province;return this;}public String getCountry() {return country;}public Address setCountry(String country) {this.country = country;return this;}public String getPostcode() {return postcode;}public Address setPostcode(String postcode) {this.postcode = postcode;return this;} }

關于上述示例的幾點注意事項:

  • 如前所述,我們現在使用@ Id, @ GeneratedValue和@Column注釋注釋實體ID的getter方法。
  • 由于現在列名稱將通過解析getter方法來確定,因此我們不再需要使用@Transient注釋來標記transientColumn字段。 但是,如果Address實體具有名稱以“ get”開頭的任何其他方法,則我們需要在其上應用@Transient 。
  • 如果一個實體沒有顯式的訪問模式信息,就像我們在本系列第一部分中創建的Address實體一樣,那么JPA會采用默認的訪問模式。 這個假設不是隨機的。 相反,JPA首先嘗試找出@Id批注的位置。 如果在字段上使用@Id批注,則假定為字段訪問模式。 如果在getter方法上使用@Id批注,則假定為屬性訪問模式。 因此,即使在上例中從地址實體中刪除@Access批注,映射仍將有效,并且JPA將采用屬性訪問模式:

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

    有關訪問模式,需要記住的一些重要要點:

  • 如果使用字段訪問模式,則永遠不要將字段聲明為公共字段。 實體的所有字段都應具有專用 (最佳!), 受保護或默認訪問類型。 其背后的原因是,將字段聲明為public將允許任何不受保護的類直接訪問實體狀態,這很容易破壞提供程序的實現。 例如,假設您有一個實體,其所有字段都是公共的。 現在,如果此實體是一個受管實體(這意味著它已保存到數據庫中),并且任何其他類都更改了其id的值,然后嘗試將所做的更改保存回數據庫,則可能會遇到不可預知的行為(在以后的文章中將嘗試詳細闡述該主題)。 甚至實體類本身也只能在初始化期間直接操作字段(即,在構造函數內部)。
  • 在屬性訪問模式下,如果我們將注釋應用于setter方法而不是getter方法,則將忽略它們。
  • 也可以將這兩種訪問類型混合使用。 假設您要對實體的除一種狀態外的所有狀態都使用字段訪問模式,對于其余一種狀態,您想使用屬性訪問模式,因為您想在向/從狀態值讀取/寫入狀態值之前執行某種轉換。數據庫。 您可以按照以下步驟輕松完成此操作:

  • 用@Access批注標記實體,并指定AccessType.FIELD作為所有字段的訪問方式。
  • 使用@Transient批注標記您不喜歡使用字段訪問模式的字段。
  • 用@Access批注標記屬性的getter方法,并指定AccessType.PROPERTY作為訪問方式。
  • 下面的示例演示了這種方法,因為將郵政編碼更改為使用屬性訪問模式:

    @Entity @Table(name = "tbl_address") @Access(AccessType.FIELD) public class Address {@Id@GeneratedValue@Column(name = "address_id")private Integer id;private String street;private String city;private String province;private String country;/*** postcode is now marked as Transient*/@Transientprivate String postcode;@Transientprivate String transientColumn;public Integer getId() {return id;}public Address setId(Integer id) {this.id = id;return this;}public String getStreet() {return street;}public Address setStreet(String street) {this.street = street;return this;}public String getCity() {return city;}public Address setCity(String city) {this.city = city;return this;}public String getProvince() {return province;}public Address setProvince(String province) {this.province = province;return this;}public String getCountry() {return country;}public Address setCountry(String country) {this.country = country;return this;}/*** We are now using property access mode for reading/writing* postcode*/@Access(AccessType.PROPERTY)public String getPostcode() {return postcode;}public Address setPostcode(String postcode) {this.postcode = postcode;return this;} }

    這里要注意的重要一點是,如果我們不使用@Access注釋對類進行注釋,以將字段訪問模式顯式指定為默認模式,而是對字段和getter方法進行注釋,則映射的結果行為將是不確定的。 這意味著結果將完全取決于持久性提供程序,即一個提供程序可能選擇使用字段訪問模式作為默認值,一個提供程序可能使用屬性訪問模式,或者一個可能決定引發異常!

    今天就這樣。 如果您發現任何問題/有任何疑問,請隨時發表評論!

    直到下一次。

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

    jpa 實體映射視圖

    總結

    以上是生活随笔為你收集整理的jpa 实体映射视图_JPA教程:实体映射-第3部分的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。