您好,登錄后才能下訂單哦!
今天小編給大家分享一下SpringData JPA注解Entity怎么使用的相關(guān)知識點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
(1)實(shí)體是直接進(jìn)行數(shù)據(jù)庫持久化操作的領(lǐng)域?qū)ο螅匆粋€(gè)簡單的POJO),必須通過@Entity注解進(jìn)行標(biāo)示。
(2)實(shí)體必須有一個(gè) public 或者 projected的無參數(shù)構(gòu)造方法.
(3)持久化映射的注解可以標(biāo)示在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;
除此之外,也可以將持久化注解運(yùn)用在Entity里面的get/set方法上,通過我們放在get方法中,如下所示:
需要注意的是: 在實(shí)體類get方法中加注解時(shí),必須保證set方法的存在,否則會報(bào)錯(cuò)
@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; }
在同一個(gè)Entity里面只能有一種方式生效,也就是說注解要么全部寫在field上面,要么就全部寫在get/set方法上
只要是在@Entity的實(shí)體里面被注解標(biāo)注的字段,都會被映射到數(shù)據(jù)庫中,除了使用@Transient注解的字段之外。
實(shí)體里面必須有一個(gè)主鍵。主鍵表示的字段可以是單個(gè)字段,也可以是復(fù)合主鍵字段。
@Entity必填項(xiàng)。用于定義對象將會成為被JPA管理的實(shí)體,將字段映射到指定的數(shù)據(jù)庫表中,使用起來很簡單,直接用在實(shí)體類上面即可。
@Target(TYPE) // 表示此注解只能用在class上面 @Retention(RUNTIME) public @interface Entity { // 默認(rèn)是實(shí)體類的名字 String name() default ""; }
@Table非必填項(xiàng)。 用于指定數(shù)據(jù)庫的表名,表示此實(shí)體對應(yīng)的數(shù)據(jù)庫里面的表名。 默認(rèn)表名和entity名字一樣
@Target(TYPE) // 表示此注解只能用在class上面 @Retention(RUNTIME) public @interface Table { // 表的名字,默認(rèn)表名和entity名字一樣 String name() default ""; // 表的目錄 String catalog() default ""; // 此表所在schema String schema() default ""; // 唯一性約束,在創(chuàng)建表的時(shí)候有用,表創(chuàng)建好之后后面就不需要了 UniqueConstraint[] uniqueConstraints() default {}; // 索引,在創(chuàng)建表的時(shí)候使用,表創(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非必填項(xiàng)。 用于指定entity里面的注解是寫在字段上面,還是get/set方法上面生效。如果默認(rèn)不填寫的情況下,當(dāng)實(shí)體里面的第一個(gè)注解出現(xiàn)在字段上或者 get/set方法上面,就以第一次出現(xiàn)的方式為準(zhǔn)。
@Target( { TYPE, METHOD, FIELD }) // 表示此注解可以運(yùn)用在類上(可以指定實(shí)體的默認(rèn)注解生成策略),也可以用在方法上或字段上(表示可以獨(dú)立設(shè)置某一個(gè)字段或者方法的生效策略) @Retention(RUNTIME) public @interface Access { AccessType value(); } public enum AccessType { FIELD, PROPERTY } @Access(value = AccessType.FIELD)
@Id定義屬性為數(shù)據(jù)庫的主鍵,一個(gè)實(shí)體里面必須有一個(gè)主鍵,但不一定是這個(gè)注解。可以和@GeneratedValue配合使用或成對出現(xiàn)。
@GeneratedValue主鍵生成策略,如下所示:
public @interface GeneratedValue { // Id的生成策略 GenerationType strategy() default AUTO; // 通過Sequences生成Id,常見的是Oracle數(shù)據(jù)庫ID生成規(guī)則,這個(gè)時(shí)候需要配合@SequenceGenerator使用 String generator() default ""; } // 生成策略 public enum GenerationType { // 通過表產(chǎn)生主鍵,框架借由表模擬序列產(chǎn)生主鍵,使用該策略可以使應(yīng)用更易于數(shù)據(jù)庫移植 TABLE, // 通過序列產(chǎn)生主鍵,通過@SequenceGenerator 注解指定序列名,MySql不支持這種方式 SEQUENCE, // 采用數(shù)據(jù)庫Id自增長,一般用于Mysql數(shù)據(jù)庫 IDENTITY, // 自動選擇合適的策略,是默認(rèn)選項(xiàng); AUTO }
@Enumerated對Enum枚舉類映射到數(shù)據(jù)庫提供下標(biāo)和name兩種方式,用法就是直接映射在enum枚舉類型的字段上。
@Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface Enumerated { EnumType value() default ORDINAL; } public enum EnumType { // 映射枚舉字段的下標(biāo) ORDINAL, // 映射枚舉的Name STRING }
@Basic表示屬性是到數(shù)據(jù)表字段的映射。如果實(shí)體的字段上沒有任何注解,默認(rèn)即為@Basic。也就是說默認(rèn)所有的字段肯定是和數(shù)據(jù)庫進(jìn)行映射的,并且默認(rèn)為Eager類型。
public @interface Basic { // EAGER 立即記載;LAZY 延遲加載; FetchType fetch() default EAGER; // 這個(gè)字段是否可以為null,默認(rèn)是true boolean optional() default true; }
@Transient表示非持久化屬性。 JPA映射數(shù)據(jù)庫的時(shí)候忽略它,與@Basic有相反的作用。
@Column 定義該屬性對應(yīng)數(shù)據(jù)庫中的
public @interface Column { // 定義了被標(biāo)注字段在數(shù)據(jù)庫表中所對應(yīng)字段的名稱; String name() default ""; // 表示該字段是否為唯一標(biāo)識 boolean unique() default false; // 數(shù)據(jù)字段是否允許為空,默認(rèn)為空 boolean nullable() default true; // 表示在使用“INSERT”腳本插入數(shù)據(jù)時(shí),是否需要插入該字段的值。 boolean insertable() default true; // 表示在使用“UPDATE”腳本插入數(shù)據(jù)時(shí),是否需要更新該字段的值 boolean updatable() default true; // 表示創(chuàng)建表時(shí),該字段創(chuàng)建的SQL語句,一般用于通過Entity生成表定義時(shí)使用 String columnDefinition() default ""; // 表示當(dāng)映射多個(gè)表時(shí),指定表的表中的字段。默認(rèn)值為主表的表名。 String table() default ""; // 表示字段的長度,當(dāng)字段的類型為varchar時(shí),該屬性才有效,默認(rèn)為255個(gè)字符。 int length() default 255; // 表示數(shù)值的總長度 int precision() default 0; // 表示小數(shù)點(diǎn)所占的位數(shù),必須和precision搭配使用 int scale() default 0; }
第一步:新建一個(gè)UserInfo類里面的屬性是聯(lián)合主鍵
@Data @Builder @AllArgsConstructor @NoArgsConstructor public class UserInfoID implements Serializable { private String name; private String telephone; }
第二步 :再新建一個(gè)UserInfo的實(shí)體,采用@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; }
第三步:新增一個(gè)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里面不再是一個(gè)@Id字段。
執(zhí)行的SQL如下:
第一步:在上面例子中的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如下所示:
@Embedded用的是對象,@IdClass用的具體的某一個(gè)字段
以上就是“SpringData JPA注解Entity怎么使用”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學(xué)習(xí)更多的知識,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。