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

Spring?Data?JPA注解Entity使用示例詳解

 更新時間:2022年09月28日 16:12:53   作者:AKone  
這篇文章主要為大家介紹了Spring?Data?JPA注解Entity使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

1、JPA協(xié)議中關于Entity的相關規(guī)定

(1)實體是直接進行數(shù)據(jù)庫持久化操作的領域對象(即一個簡單的POJO),必須通過@Entity注解進行標示。

(2)實體必須有一個 public 或者 projected的無參數(shù)構造方法.

(3)持久化映射的注解可以標示在Entity的字段field上(比較適合使用Lombok的情況),如下所示

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "int(11) NOT NULL COMMENT '主鍵' ")
private Integer id;
@Column(columnDefinition = "varchar(30) DEFAULT '' COMMENT '書名'")
private String bookName;
@Column(columnDefinition = "int(11) DEFAULT 0  COMMENT '數(shù)量'")
private Integer amount;

除此之外,也可以將持久化注解運用在Entity里面的get/set方法上,通過我們放在get方法中,如下所示:
需要注意的是: 在實體類get方法中加注解時,必須保證set方法的存在,否則會報錯

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(columnDefinition = "int(11) NOT NULL COMMENT '主鍵' ")
public Integer getId() {
    return id;
}
@Column(columnDefinition = "varchar(30) DEFAULT '' COMMENT '寵物名'")
public String getName() {
    return name;
}
@Column(columnDefinition = "int(11) DEFAULT NULL COMMENT '年齡'")
public Integer getAge() {
    return age;
}

需要注意的是:

在同一個Entity里面只能有一種方式生效,也就是說注解要么全部寫在field上面,要么就全部寫在get/set方法上

  • 只要是在@Entity的實體里面被注解標注的字段,都會被映射到數(shù)據(jù)庫中,除了使用@Transient注解的字段之外。
  • 實體里面必須有一個主鍵。主鍵表示的字段可以是單個字段,也可以是復合主鍵字段。

2、常用注解

2.1 JPA支持的注解

2.2 常用注解

@Entity必填項。用于定義對象將會成為被JPA管理的實體,將字段映射到指定的數(shù)據(jù)庫表中,使用起來很簡單,直接用在實體類上面即可。

 @Target(TYPE) // 表示此注解只能用在class上面
 @Retention(RUNTIME)
 public @interface Entity {
    // 默認是實體類的名字
    String name() default "";
 }

@Table非必填項。 用于指定數(shù)據(jù)庫的表名,表示此實體對應的數(shù)據(jù)庫里面的表名。 默認表名和entity名字一樣

  @Target(TYPE)  // 表示此注解只能用在class上面
  @Retention(RUNTIME)
  public @interface Table {
      // 表的名字,默認表名和entity名字一樣
      String name() default "";
      // 表的目錄
      String catalog() default "";
      // 此表所在schema
      String schema() default "";
      // 唯一性約束,在創(chuàng)建表的時候有用,表創(chuàng)建好之后后面就不需要了
      UniqueConstraint[] uniqueConstraints() default {};
      // 索引,在創(chuàng)建表的時候使用,表創(chuàng)建之后后面就不需要了
      Index[] indexes() default {};
  }
  // 單一字段唯一性約束
  uniqueConstraints = {@UniqueConstraint(name = "unique_age",columnNames = "age")}
  // 聯(lián)合約束
  uniqueConstraints = {@UniqueConstraint(name = "unique_name",columnNames = {"name","age"})}
  // 索引
  indexes = {@Index(name = "nameIndex",columnList = "name")})

@Access非必填項。 用于指定entity里面的注解是寫在字段上面,還是get/set方法上面生效。如果默認不填寫的情況下,當實體里面的第一個注解出現(xiàn)在字段上或者 get/set方法上面,就以第一次出現(xiàn)的方式為準。

@Target( { TYPE, METHOD, FIELD }) // 表示此注解可以運用在類上(可以指定實體的默認注解生成策略),也可以用在方法上或字段上(表示可以獨立設置某一個字段或者方法的生效策略)
@Retention(RUNTIME)
public @interface Access {
    AccessType value();
}
public enum AccessType {
    FIELD,
    PROPERTY
}
@Access(value = AccessType.FIELD)

@Id定義屬性為數(shù)據(jù)庫的主鍵,一個實體里面必須有一個主鍵,但不一定是這個注解??梢院虭GeneratedValue配合使用或成對出現(xiàn)。

@GeneratedValue主鍵生成策略,如下所示:

public @interface GeneratedValue {
    // Id的生成策略
    GenerationType strategy() default AUTO;
    // 通過Sequences生成Id,常見的是Oracle數(shù)據(jù)庫ID生成規(guī)則,這個時候需要配合@SequenceGenerator使用
    String generator() default "";
}
// 生成策略
public enum GenerationType { 
    // 通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應用更易于數(shù)據(jù)庫移植
    TABLE, 
    // 通過序列產(chǎn)生主鍵,通過@SequenceGenerator 注解指定序列名,MySql不支持這種方式
    SEQUENCE, 
    // 采用數(shù)據(jù)庫Id自增長,一般用于Mysql數(shù)據(jù)庫
    IDENTITY, 
    // 自動選擇合適的策略,是默認選項;
    AUTO
}

@Enumerated對Enum枚舉類映射到數(shù)據(jù)庫提供下標和name兩種方式,用法就是直接映射在enum枚舉類型的字段上。

@Target({METHOD, FIELD}) 
@Retention(RUNTIME)
public @interface Enumerated {
    EnumType value() default ORDINAL;
}
public enum EnumType {
    // 映射枚舉字段的下標
    ORDINAL,
    // 映射枚舉的Name
    STRING
}

@Basic表示屬性是到數(shù)據(jù)表字段的映射。如果實體的字段上沒有任何注解,默認即為@Basic。也就是說默認所有的字段肯定是和數(shù)據(jù)庫進行映射的,并且默認為Eager類型。

public @interface Basic {
    // EAGER 立即記載;LAZY 延遲加載;
    FetchType fetch() default EAGER;
    // 這個字段是否可以為null,默認是true
    boolean optional() default true;
}

@Transient表示非持久化屬性。 JPA映射數(shù)據(jù)庫的時候忽略它,與@Basic有相反的作用。

@Column 定義該屬性對應數(shù)據(jù)庫中的

public @interface Column {
    // 定義了被標注字段在數(shù)據(jù)庫表中所對應字段的名稱;
    String name() default "";
    // 表示該字段是否為唯一標識
    boolean unique() default false;
    // 數(shù)據(jù)字段是否允許為空,默認為空
    boolean nullable() default true;
    // 表示在使用“INSERT”腳本插入數(shù)據(jù)時,是否需要插入該字段的值。
    boolean insertable() default true;
    // 表示在使用“UPDATE”腳本插入數(shù)據(jù)時,是否需要更新該字段的值
    boolean updatable() default true;
    // 表示創(chuàng)建表時,該字段創(chuàng)建的SQL語句,一般用于通過Entity生成表定義時使用
    String columnDefinition() default "";
    // 表示當映射多個表時,指定表的表中的字段。默認值為主表的表名。
    String table() default "";
    // 表示字段的長度,當字段的類型為varchar時,該屬性才有效,默認為255個字符。
    int length() default 255;
    // 表示數(shù)值的總長度
    int precision() default 0;
    // 表示小數(shù)點所占的位數(shù),必須和precision搭配使用
    int scale() default 0;
}

3、聯(lián)合主鍵

3.1 @IdClass

第一步:新建一個UserInfo類里面的屬性是聯(lián)合主鍵

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserInfoID implements Serializable {
    private String name;
    private String telephone;
}

第二步 :再新建一個UserInfo的實體,采用@IdClass引用聯(lián)合主鍵類

@Entity
@Data
@Builder
@IdClass(UserInfoID.class)
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    private Integer ages;
    @Id
    private String name;
    @Id
    private String telephone;
}

第三步:新增一個UserInfoRepo類來做持久化操作

public interface UserInfoRepo extends JpaRepository<UserInfo, UserInfoID> {
}

第四步:測試用例

@Test
public void queryIndex2(){
    userInfoRepo.save(UserInfo.builder()
    .ages(1)
    .name("jack")
    .telephone("123456789").build());
    userInfoRepo.findById(UserInfoID.builder()
            .name("jack")
            .telephone("123456789").build());
}

通過上面例子我們可以發(fā)現(xiàn),我們的表的主鍵是primary key(name,telephone),而Entity里面不再是一個@Id字段。

執(zhí)行的SQL如下:

3.2 @Embeddable與@EmbeddedId注解使用

第一步:在上面例子中的UserInfoID里面添加@Embeddable注解

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Embeddable
public class UserInfoID implements Serializable {
    private String name;
    private String telephone;
}

第二步:在UserInfo類中,刪除@IdClass,添加@EmbeddeId注解,如下:

@Entity
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class UserInfo {
    private Integer ages;
    @EmbeddedId
    private UserInfoID userInfoID;
    @Column(unique = true)
    private String uniqueNumber;
}

第三步:UserInfoRepo保持不變 第四步:測試用例

@Test
public void queryIndex(){
    userInfoRepo.save(UserInfo.builder()
            .ages(1)
            .userInfoID(UserInfoID.builder()
                    .name("jack")
                    .telephone("123456789").build()).build());
    userInfoRepo.findById(UserInfoID.builder()
            .name("jack")
            .telephone("123456789").build());
}

執(zhí)行的SQL如下所示:

3.3 兩者的區(qū)別是什么?

  • @Embedded用的是對象,@IdClass用的具體的某一個字段

以上就是Spring Data JPA注解Entity使用示例詳解的詳細內(nèi)容,更多關于Spring Data JPA注解Entity的資料請關注腳本之家其它相關文章!

相關文章

  • Java 的雙重分發(fā)與 Visitor 模式實例詳解

    Java 的雙重分發(fā)與 Visitor 模式實例詳解

    這篇文章主要介紹了Java 的雙重分發(fā)與 Visitor 模式實例詳解,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-07-07
  • Java中的while無限循環(huán)結構及實例

    Java中的while無限循環(huán)結構及實例

    這篇文章主要介紹了Java中的while無限循環(huán)結構及實例,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 如何利用Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽

    如何利用Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽

    在高并發(fā)和大數(shù)據(jù)環(huán)境下,實時獲取?MySQL?數(shù)據(jù)庫的增量變化對數(shù)據(jù)同步、數(shù)據(jù)分析、緩存更新等場景至關重要,下面我們就來看看如何通過Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽吧
    2025-02-02
  • 基于Java語言的遞歸運算例題詳解

    基于Java語言的遞歸運算例題詳解

    一個方法在執(zhí)行過程中調用自身, 就稱為 "遞歸"。本文將通過幾個例題帶大家深入了解一下Java語言中的遞歸運算,感興趣的可以了解一下
    2022-08-08
  • SparkSQL使用IDEA快速入門DataFrame與DataSet的完美教程

    SparkSQL使用IDEA快速入門DataFrame與DataSet的完美教程

    本文給大家介紹使用idea開發(fā)Spark SQL 的詳細過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-08-08
  • Java多種方法實現(xiàn)合并多個list對象列表

    Java多種方法實現(xiàn)合并多個list對象列表

    Java編程中,合并多個列表對象可以通過Stream?API或傳統(tǒng)循環(huán)方式實現(xiàn),使用Stream?API合并時,利用flatMap方法將嵌套的List展平,再通過collect方法收集成一個新的列表,傳統(tǒng)循環(huán)則通過創(chuàng)建一個空的ArrayList,并通過遍歷每個列表將元素添加進去
    2024-09-09
  • java之使用stream對日期排序方式

    java之使用stream對日期排序方式

    這篇文章主要介紹了java之使用stream對日期排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • springboot依賴沖突問題及解決過程

    springboot依賴沖突問題及解決過程

    新搭了一個springboot 2.3.7.RELASE的框架,在集成mysql,tkMapper,mybatis的過程中,啟動報錯,怎么解決這個問題呢,下面小編給大家?guī)砹藄pringboot依賴沖突問題及解決過程,一起看看吧
    2021-09-09
  • Spring中的Aware接口及應用場景詳解

    Spring中的Aware接口及應用場景詳解

    這篇文章主要介紹了Spring中的Aware接口及應用場景,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Java并發(fā)容器相關知識總結

    Java并發(fā)容器相關知識總結

    今天給大家?guī)淼奈恼率荍ava并發(fā)容器的相關知識,文中有非常詳細的介紹,對正在學習Java并發(fā)容器的小伙伴們很有幫助,需要的朋友可以參考下
    2021-06-06

最新評論

云龙县| 满城县| 柳州市| 蓬莱市| 镇赉县| 光泽县| 田阳县| 张掖市| 治县。| 瓦房店市| 澄城县| 达孜县| 扶沟县| 榆树市| 邓州市| 城市| 佛山市| 靖江市| 台南市| 九江县| 陆河县| 建水县| 屯门区| 淳安县| 垣曲县| 新乡市| 达州市| 马关县| 蓬安县| 呼玛县| 阳高县| 秦皇岛市| 仙游县| 郯城县| 麻阳| 荆州市| 于田县| 固阳县| 皮山县| 桦川县| 巴塘县|