最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringDataJPA在Entity中常用的注解介紹

 更新時(shí)間:2021年12月06日 10:38:33   作者:Coope  
這篇文章主要介紹了SpringDataJPA在Entity中常用的注解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

首先我們常用的注解包括

@Entity、@Table、@Id、@IdClass、@GeneratedValue、@Basic、@Transient、@Column、@Temporal、@Enumerated、@Lob

  • @Entity使用此注解定義的對(duì)象將會(huì)成為被JPA管理的實(shí)體,將映射到指定的數(shù)據(jù)庫表@Entity(name =“user”)其中name默認(rèn)是此實(shí)體類的名字,全局唯一。
  • @Table指定此實(shí)體類對(duì)應(yīng)的數(shù)據(jù)庫的表名。若注解不加名字則系統(tǒng)認(rèn)為表名和實(shí)體類的名字相同
  • @Id定義字段為數(shù)據(jù)庫的主鍵,一個(gè)實(shí)體里面必須有一個(gè)。
  • @IdClass利用外部類的聯(lián)合主鍵,其中外部類必須滿足一下幾點(diǎn)要求

必須實(shí)現(xiàn)Serializable接口。

必須有默認(rèn)的public無參數(shù)的構(gòu)造方法。

必須覆蓋equals和hashCode方法。equals方法用于判斷兩個(gè)對(duì)象是否相同,EntityManger通過find方法來查找Entity時(shí)是根據(jù)equals的返回值來判斷的。hashCode方法返回當(dāng)前對(duì)象的哈希碼,生成的hashCode相同的概率越小越好,算法可以進(jìn)行優(yōu)化。

  • @GeneratedValue為主鍵生成策略

默認(rèn)為AUTO即JPA自動(dòng)選擇合適的策略

IDENTITY 適用于MySQL,策略為自增

SEQUENCE 通過序列生成主鍵通過@SquenceGenerator指定序列名MySQL不支持

TABLE 框架由表模擬產(chǎn)生主鍵,使用該策略有利于數(shù)據(jù)庫移植

  • @Basic表示此字段是映射到數(shù)據(jù)庫,如果實(shí)體字段上沒有任何注解默認(rèn)為@Basic。其中可選參數(shù)為@Basic(fetch =FetchType.LAZY, optional =false)其中fetch默認(rèn)為EAGER立即加載,LAZY為延遲加載、optional表示該字段是否可以為null
  • @Transient和@Basic的作用相反,表示該字段不是一個(gè)到數(shù)據(jù)庫表的字段映射,JPA映射數(shù)據(jù)庫的時(shí)候忽略此字段。
  • @Column定義實(shí)體內(nèi)字段對(duì)應(yīng)的數(shù)據(jù)庫中的列名
@Column(name = "real_name", unique = true, nullable = false, insertable = false, updatable = false, columnDefinition = "varchar", length = 100)

name對(duì)應(yīng)數(shù)據(jù)庫的字段名,可選默認(rèn)字段名和實(shí)體屬性名一樣

unique是否唯一,默認(rèn)false,可選

nullable是否允許為空。可選,默認(rèn)為true

insertable執(zhí)行insert的時(shí)候是否包含此字段。可選,默認(rèn)true

updatable執(zhí)行update的時(shí)候是否包含此字段??蛇x,默認(rèn)true

columnDefinition表示該字段在數(shù)據(jù)庫中的實(shí)際類型

length數(shù)據(jù)庫字段的長度,可選,默認(rèn)25

  • @Temporal用來設(shè)置Date類型的屬性映射到對(duì)應(yīng)精度的字段
@Temporal(TemporalType.DATE)    //映射為只有日期
@Temporal(TemporalType.TIME)    //映射為只有時(shí)間
@Temporal(TemporalType.TIMESTAMP)  //映射為日期+時(shí)間
  • @Lob將字段映射成數(shù)據(jù)庫支持的大對(duì)象類型,支持一下兩種數(shù)據(jù)庫類型的字段。(注意:Clob、Blob占用的內(nèi)存空間較大,一般配合@Basic(fetch= FetchType.LAZY)將其設(shè)置為延遲加載)

Clob:字段類型為Character[]、char[]、String將被映射為Clob

Blob:字段類型為Byte[]、byte[]和實(shí)現(xiàn)了Serializable接口的類型將被映射為Blob類型

接下來介紹關(guān)聯(lián)關(guān)系注解

@JoinColumn、@OneToOne、@OneToMany、@ManyToOne、@ManyToMany、@JoinTable、@OrderBy

1.@JoinColumn定義外鍵關(guān)聯(lián)字段名稱,其中屬性意義如下

  • name表示目標(biāo)表的字段名,必填
  • referencedColumnName本實(shí)體表的字段名,非必填,默認(rèn)是本表的ID
  • unique外鍵字段是否唯一,可選,默認(rèn)false
  • nullable外鍵字段是否允許為空,可選,默認(rèn)true
  • insertable新增操作的時(shí)候是否跟隨一起新增,可選,默認(rèn)true
  • updatable更新時(shí)候是否一起更新??蛇x,默認(rèn)true
  • @JoinColumn主要配合@OneToOne、@ManyToOne、@OneToMany一起使用,單獨(dú)使用沒有任何意義。
  • @JoinColumns定義多個(gè)字段的關(guān)聯(lián)關(guān)系

2.@OneToOne一對(duì)一關(guān)聯(lián)關(guān)系

@OneToOne(targetEntity = SysRole.class, cascade = {CascadeType.PERSIST,CascadeType.REMOVE,CascadeType.REFRESH,CascadeType.MERGE},fetch = FetchType.LAZY,optional = false,mappedBy = "userId",orphanRemoval = true)
  • targetEntity非必填,默認(rèn)為該字段的類型
  • cascade級(jí)聯(lián)操作策略CascadeType.PERSIST級(jí)聯(lián)新建,CascadeType.REMOVE級(jí)聯(lián)刪除,CascadeType.REFRESH級(jí)聯(lián)刷新,CascadeType.MERGE級(jí)聯(lián)更新,CascadeType.ALL四項(xiàng)全選
  • fetch數(shù)據(jù)加載方式,默認(rèn)EAGER(立即加載),LAZY(延遲加載)
  • optional是否允許為空??蛇x,默認(rèn)為true
  • mappedBy關(guān)聯(lián)關(guān)系被誰維護(hù),非必填,一般不需要特別指定。注意:只有關(guān)系維護(hù)方才能操作兩者的關(guān)系,被維護(hù)方即使設(shè)置了維護(hù)方的屬性進(jìn)行存儲(chǔ)也不會(huì)更新外鍵關(guān)聯(lián)。mappedBy不能與@JoinColumn或者@JoinTable同時(shí)使用。mappedBy的值指的是另一方的實(shí)體里面屬性的字段,而不是數(shù)據(jù)庫字段,也不是實(shí)體對(duì)象的名字,即另一方配置了@JoinColumn或者@JoinTable注解的屬性的字段名稱
  • orphanRemoval是否級(jí)聯(lián)刪除,和CascadeType.REMOVE效果一樣,兩種只要配置一種就會(huì)自動(dòng)級(jí)聯(lián)刪除
  • @OneToOne需要配合@JoinColumn一起使用,可以雙向關(guān)聯(lián),也可以只配置一方。下面我們舉一個(gè)例子:假設(shè)一個(gè)用戶只擁有一個(gè)角色SysUser如下
@OneToOne
@JoinColumn(name = "role_id",referencedColumnName = "user_id")
private SysRole role;
//若需要雙向關(guān)聯(lián)則SysRole的內(nèi)容如下
@OneToOne(mappedBy = "role")
private SysUser user;
//當(dāng)然也可以不用選擇mappedBy,使用下面效果也一樣
@OneToOne
@JoinColumn(name = "user_id",referencedColumnName = "role_id")
private SysUser user;

3.@OneToMany和@ManyToOne一對(duì)多和多對(duì)一的關(guān)聯(lián)關(guān)系

@Entity
@Table(name="user")
class User implements Serializable{
    private Long userId;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user")
    private Set<Role> setRole;
}
@Entity
@Table(name="role")
class Role{
    private Long roleId;
    @ManyToOne(cascade = CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name = "user_id")//user_id字段作為外鍵
    private User user;
}

4.@OrderBy關(guān)聯(lián)查詢的時(shí)候排序,一般和@OneToMany一起使用

@Entity
@Table(name="user")
class User implements Serializable{
    private Long userId;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user")
    @OrderBy("role_name DESC")
    private Set<Role> setRole;
}

5.@JoinTable關(guān)聯(lián)關(guān)系表一般和@ManyToMany一起使用

@ManyToMany表示多對(duì)多,也有單雙向之分,單雙向和注解無關(guān),只看實(shí)體類之間是否相互引用

@JoinTable(name = "sys_user_role",
  joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
@ManyToMany(cascade = {CascadeType.REFRESH}, fetch = FetchType.EAGER)
private List<SysRole> roles;
  • @JoinTable中name表示中間關(guān)聯(lián)關(guān)系表名
  • @JoinTable中的joinColumns表示主鏈接表的字段,即當(dāng)前對(duì)象內(nèi)對(duì)應(yīng)的連接字段
  • @JoinTable中inverseJoinColumns表示被連接的表的外鍵字段

6.Left Join、Inner join和@EntityGraph

當(dāng)使用@ManyToMany、@ManytoOne、@OneToMany、@OneToOne關(guān)聯(lián)關(guān)系的時(shí)候SQL執(zhí)行查詢的時(shí)候總是一條主查詢語句和N條子查詢語句組成,運(yùn)行的效率較地下,如果子對(duì)象有N個(gè)就會(huì)執(zhí)行N+1條SQL,JPA2.1推出的@EntityGraph、@NamedEntityGraph用來提高查詢效率@NamedEntityGraph配置在@Entity上面,而@EntityGraph配置在Repository的查詢方法上面

@NamedEntityGraph(name = "User.addressEntityList",attributeNodes = {@NamedAttributeNode("setRole"),@NamedAttributeNode("dept")})
@Entity
@Table(name="user")
public class User implements Serializable{
    private Long userId;
    @OneToMany(cascade = CascadeType.ALL,fetch = FetchType.LAZY,mappedBy = "user")
    @OrderBy("role_name DESC")
    private Set<Role> setRole;
    @OneToOne
    @JoinColumn(name = "dept_id",referencedColumnName = "user_id")
    private Department dept;
}

然后只需要在Repository查詢方法上面加上@EntityGraph注解即可,其中value就是@NamedEntityGraph中的Name,配置如下

@EntityGraph(value ="User.addressEntityList")
List<User> findAll();

對(duì)于關(guān)系查詢需要注意以下事項(xiàng):

  • 所有的注解要么全部配置在字段上,要么全部配置在get方法上面,不能混用,混用項(xiàng)目就會(huì)啟動(dòng)不起來
  • 所有關(guān)聯(lián)都支持單雙向關(guān)聯(lián)。當(dāng)JSON序列化的時(shí)候使用雙向注解會(huì)產(chǎn)生死循環(huán),需要人為手動(dòng)轉(zhuǎn)換一次,或者使用@JsonIgnore
  • 所有的關(guān)聯(lián)表一般不需要建立外鍵索引

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例

    Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例

    本文主要介紹了Springboot整合阿里巴巴SMS的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-12-12
  • 為什么Java中都不用a.equals(b)判斷對(duì)象相等

    為什么Java中都不用a.equals(b)判斷對(duì)象相等

    在面試中經(jīng)常會(huì)被問,a.equals(b)和“==”的區(qū)別,那么a.equals(b)能不能判斷對(duì)象相等,本文就來詳細(xì)的介紹一下
    2021-06-06
  • Spring Boot conditional注解用法詳解

    Spring Boot conditional注解用法詳解

    這篇文章主要介紹了Spring Boot conditional注解用法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-03-03
  • spring boot如何指定啟動(dòng)端口

    spring boot如何指定啟動(dòng)端口

    這篇文章主要介紹了spring boot如何指定啟動(dòng)端口,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解

    springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的

    今天小編就為大家分享一篇關(guān)于springmvc中RequestMappingHandlerAdapter與HttpMessageConverter的裝配講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Java?C++題解leetcode817鏈表組件示例

    Java?C++題解leetcode817鏈表組件示例

    這篇文章主要為大家介紹了Java?C++題解leetcode817鏈表組件示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印的操作方法

    springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印的操作方法

    這篇文章主要介紹了springboot整合阿里云百煉DeepSeek實(shí)現(xiàn)sse流式打印,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2025-04-04
  • Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析

    Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析

    這篇文章主要介紹了Java 圖片復(fù)制功能實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • java中的4種循環(huán)方法示例詳情

    java中的4種循環(huán)方法示例詳情

    大家好,本篇文章主要講的是java中的4種循環(huán)方法示例詳情,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • 完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題

    完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題

    這篇文章主要介紹了完美解決SpringCloud-OpenFeign使用okhttp替換不生效問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02

最新評(píng)論

丹阳市| 安新县| 鱼台县| 久治县| 遂宁市| 长顺县| 巴青县| 巧家县| 镇巴县| 宜阳县| 嵊州市| 霸州市| 绥宁县| 广宗县| 高州市| 东乌| 平南县| 鲁山县| 台南县| 招远市| 清涧县| 龙胜| 郁南县| 杨浦区| 楚雄市| 平山县| 四会市| 宁陕县| 肥乡县| 神池县| 阿拉善左旗| 龙南县| 西平县| 陵水| 房山区| 台前县| 周口市| 黄山市| 庆云县| 建阳市| 汤原县|