成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JPA實體類注解,看這篇就全會了

開發 前端
當實體類與其映射的數據庫表名不同名時需要使用@Table標注說明,該標注與@Entity標注并列使用,置于實體類聲明語句之前。

哈嘍,大家好,我是指北君。

今天給大家介紹一下 JPA 實體類中的注解,希望能對大家有幫助。

基本注解

@Entity

標注于實體類聲明語句之前,指出該 Java 類為實體類,將映射到指定的數據庫表。

  • name(可選):實體名稱。 缺省為實體類的非限定名稱。該名稱用于引用查詢中的實體。

不與 @Table 結合時,表名默認為類名的 SnakeCase(蛇形命名法),若使用name屬性,則表名為 name 值。

//以下三個類皆映射表名 student_info 
@Entity
public class StudentInfo{...}

@Entity(name="student_info")
public class StudentInfo{...}

@Entity
@Table(name = 'student_info')
public class StudentInfo{...}

@Table

當實體類與其映射的數據庫表名不同名時需要使用@Table標注說明,該標注與@Entity標注并列使用,置于實體類聲明語句之前。

  • name:用于指明數據庫的表名。
  • catalog、schema:用于設置表所屬的數據庫目錄或模式,通常為數據庫名。Mysql不支持catalog,schema是數據庫名。一般不需要設置。
  • uniqueConstraints:用來批量命名唯一鍵,其作用等同于多個:@Column(unique = true),一般不需要設置。
@Entity
@Table(name = "student_info", uniqueConstraints = {@UniqueConstraint(columnNames = "class_id")})
public class StudentInfo {
@Column(name = "class_id")
private String classId;
}

@Basic(未加注解的默認注解)

表示一個簡單的屬性到數據庫表的字段的映射,對于沒有任何注解的屬性,默認即為 @Basic 。

  • fetch: 表示該屬性的讀取策略,其中 EAGER (默認)表示立即加載,LAZY 表示延遲加載。
  • optional:表示該屬性是否允許為 null ,默認為 true 。

@Transient

表示該屬性并非一個到數據庫表的字段的映射,ORM 框架將忽略該屬性。

如果一個屬性并非數據庫表的字段映射,就務必將其標示為@Transient,否則,ORM框架默認其注解為@Basic 。

@Column

當實體的屬性與其映射的數據庫表的列不同名時需要使用@Column 標注說明,該注解通常置于實體的屬性前或屬性的getter方法之前,還可與 @Id 標注一起使用。

  • name:用于設置映射數據庫表的列名。
  • unique:是否是唯一標識,默認為 false(不唯一)
  • nullable:否允許為 null,默認為true(null)
  • insertable:表示在 ORM 框架執行插入操作時,該字段是否應出現 INSERT 語句中,默認為true
  • updatable:表示在 ORM 框架執行更新操作時,該字段是否應該出現在 UPDATE 語句中,默認為 true。對于一經創建就不可以更改的字段,該屬性非常有用,如對于birthday字段。或者創建時間/注冊時間(可以將其設置為 false 不可修改)。
  • length:數據長度,僅對String類型的字段有效,默認值255
  • precision、scale:表示精度,當字段類型為double時,precision表示數值的總長度,scale表示小數點所占的位數,默認值均為0。
  • columnDefinition:表示該字段在數據庫中的實際類型。通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是如果要將 String 類型映射到特定數據庫的 BLOB 或 TEXT 字段類型,該屬性非常有用。

@Id

用于聲明一個實體類的屬性映射為數據庫的主鍵列。

@GeneratedValue

  • JPA通用策略生成器,通過 strategy 屬性指定。
  • 定義了以下幾種可供選擇的策略:

AUTO:JPA 自動選擇合適的策略,是默認選項;

IDENTITY:采用數據庫 ID自增長的方式來自增主鍵字段,Oracle 不支持這種方式;

SEQUENCE:通過序列產生主鍵,通過 @SequenceGenerator 注解指定序列名,MySql 不支持這種方式

TABLE:通過表產生主鍵,框架借由表模擬序列產生主鍵,使用該策略可以使應用更易于數據庫移植。該策略一般與另外一個注解一起使用@TableGenerator。

  • 默認情況下,JPA 自動選擇一個最適合底層數據庫的主鍵生成策略:SqlServer 對應 IDENTITY,MySQL 對應 AUTO。
  • generator:使用指定的主鍵生成器時,這里設置為生成器名稱。

@GenericGenerator

自定義主鍵生成策略

  • name:生成器名稱
  • strategy:預定義的 Hibernate 策略或完全限定的類名。
@Data
@Entity
@Table(name = "student_info")
public class StudentInfo {
@Id
@Column(name = "id")
@GenericGenerator(name="idGenerator", strategy="uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Transient
private String age;

@Column(name = "name")
private String name;
}

其他注解

@Enumerated

直接映射枚舉類型的字段。

  • value:

ORDINAL:映射到數據庫字段為數字(默認)

String:映射到數據庫字段為字符串

@Entity
@Data
@Table(name = "StudentInfo")
public class Student {
@Column
@Enumerated
private Sex sex;
}

@Temporal

對于日期時間屬性映射時,可使用 @Temporal 注解來調整精度。

  • DATE:日期
  • TIME:時間
  • TIMESTAMP:日期時間
@Data
@Entity
@Table(name = "student_info")
public class Student {
@Column
@Temporal(TemporalType.DATE)
private Date birthday;
}

@DynamicInsert、@DynamicUpdate

  • @DynamicInsert:設置為true,表示insert對象的時候,生成動態的insert語句,如果這個字段的值是null就不會加入到insert語句中。
  • @DynamicUpdate:設置為true,表示update對象的時候,生成動態的update語句,如果這個字段的值是null就不會被加入到update語句中。
@Data
@Entity
@Table(name = "user_info")
@DynamicInsert
@DynamicUpdate
public class User {
@Id
@Column(name = "id")
@GenericGenerator(name="idGenerator", strategy="uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column(name = "name")
private String name;

@Basic
private Integer age;

@Column(name = "create_time")
private Long createTime;

@Column(name = "remark")
private String remark;
}

@Access

指定實體的訪問模式(Access mode),包括AccessType.FIELD及AccessType.PROPERTY。

  • AccessType.FIELD: 字段訪問(@Column注解在屬性上),通過字段來獲取或設置實體的狀態,getter和setter方法可能存在或不存在。這樣JPA默認的訪問類型為AccessType.FIELD。
  • AccessType.PROPERTY: 屬性訪問(@Column注解在get方法上),持久化屬性必須有getter和setter方法,屬性的類型由getter方法的返回類型決定,同時必須與傳遞到setter方法的單個參數的類型相同。這樣JPA默認的訪問類型為AccessType.PROPERTY。

復合主鍵

@EmbeddedId + @Embeddable

當需要多個屬性作為復合主鍵時,可以把該屬性做為一個內部類嵌套在實體類中,使用@EmbeddedId + @Embeddable實現:

  • @EmbeddedId:復合主鍵
  • @Embeddable:注釋Java類的,表示類是嵌入類:

必須要實現Serializable接口

需要有無參的構造函數

// 復合主鍵類
@Data
@Embeddable
public static class StudentId implements Serializable {

@Column(name = "id")
private Integer id;

@Column(name = "class_id")
private Integer classId;
}

//實體類
@Data
@Entity
@Table(name = "student_info")
public class StudentInfo {



@EmbeddedId
private StudentId studentId;

@Column(name = "name")
private String name;

}

@IdClass

注解復合主鍵的類,復合主鍵類必須滿足:

  • 實現Serializable接口;
  • 有默認的public無參數的構造方法;
  • 重寫equals和hashCode方法。
// 復合主鍵類
@Data
@Embeddable
public static class StudentId implements Serializable {

@Column(name = "id")
private Integer id;

@Column(name = "class_id")
private Integer classId;
}

//實體類
@Data
@Entity
@IdClass(StudentId.class)
@Table(name = "student_info")
public class StudentInfo {

@EmbeddedId
private StudentId studentId;

@Column(name = "name")
private String name;

}

@Embedded + @AttributeOverride

  • @Embedded:注釋屬性的,表示該屬性的類是嵌入類。
  • @AttributeOverrides:里面只包含了@AttributeOverride類型數組。
  • @AttributeOverride:包含要覆蓋的@Embeddable類中字段名name和新增的@Column字段的屬性。
// 復合主鍵類
@Data
@Embeddable
public static class StudentId implements Serializable {
private Integer id;
private Integer classId;
}

@Data
@Entity
@Table(name = "student_info")
public class StudentInfo {

@Embedded
@AttributeOverrides( {
@AttributeOverride(name = "id", column = @Column(name = "id")),
@AttributeOverride(name = "classId", column = @Column(name = "class_id"))
})
private StudentId id;

@Column(name = "name")
private String name;

}

實體間關聯關系

@OneToOne

實體間一對一的關系。

  • fetch:立即加載和延遲加載
  • cascade:當前類對象操作了之后,級聯對象的操作。

REMOVE:級聯刪除操作。刪除當前實體時,與它有映射關系的實體也會跟著被刪除。

MERGE:級聯更新(合并)操作。當前對象中的數據改變,會相應地更新級聯對象中的數據。

DETACH:級聯脫管/游離操作。如果要刪除一個實體,但是它有外鍵無法刪除,你就需要這個級聯權限了。它會撤銷所有相關的外鍵關聯。

REFRESH:級聯刷新操作。更新數據前先刷新對象和級聯對象,再更新。

PERSIST:級聯持久化(保存)操作。持久保存擁有方實體時,也會持久保存該實體的所有相關數據。

ALL,當前類增刪改查改變之后,關聯類跟著增刪改查,擁有以上所有級聯操作權

  • mappedBy:擁有關聯關系的域,如果關系是單向的就不需要,雙向關系表,那么擁有關系的這一方有建立、解除和更新與另一方關系的能力,而另一方沒有,只能被動管理,這 個屬性被定義在關系的被擁有方。
  • orphanRemoval:如果設置為true,當關系被斷開時,多方實體將被刪除。否則會將對象的引用置為null。
  • targetEntity:表示該屬性關聯的實體類型。該屬性通常不必指定,ORM 框架根據屬性類型自動判斷。

一對一關系的例子

people 表(id,name,sex,birthday,address_id) address 表(id,phone,zipcode,address)

People和Address是一對一的關系。

方式一:通過外鍵的方式(一個實體通過外鍵關聯到另一個實體的主鍵)

@JoinColum:保存表與表之間關系的字段,它要標注在實體屬性上。一般修飾在主控方,用來定義一對一,一對多等關系列。

關聯的實體的主鍵一般是用來做外鍵的。但如果此時不想主鍵作為外鍵,則需要設置referencedColumnName屬性。

@Entity
public class People {

@Id
@Column(name = "id")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column(name = "name")
private String name;//姓名

@Column(name = "sex")
private String sex;//性別

@Column(name = "birthday")
private Date birthday;//出生日期

@OneToOne(cascade=CascadeType.ALL)//People是關系的維護端,當刪除 people,會級聯刪除 address
@JoinColumn(name = "address_id", referencedColumnName = "id")
private Address address;//地址

}

@Entity
public class Address {
@Id
@Column(name = "id")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column(name = "phone")
private String phone;//手機

@Column(name = "zipcode")
private String zipcode;//郵政編碼

@Column(name = "address")
private String address;//地址
}

方式二:通過關聯表的方式來保存一對一的關系。

關聯表:people_address (people_id,address_id)

@JoinTable:用于構建一對多,多對多時的連接表,默認會以主控表加下劃線加反轉表為表名。

  • JoinColumns:該屬性值可接受多個@JoinColumn,用于配置連接表中外鍵列的信息,這些外鍵列參照當前實體對應表的主鍵列。
  • inverseJoinColumns:該屬性值可接受多個@JoinColumn,用于配置連接表中外鍵列的信息,這些外鍵列參照當前實體的關聯實體對應表的主鍵列。
@Entity
public class People {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false)
private Long id;//id

@Column(name = "name")
private String name;//姓名

@Column(name = "sex")
private String sex;//性別

@Column(name = "birthday")
private Timestamp birthday;//出生日期

@OneToOne(cascade=CascadeType.ALL)//People是關系的維護端
@JoinTable(name = "people_address",
joinColumns = @JoinColumn(name="people_id"),
inverseJoinColumns = @JoinColumn(name = "address_id"))
private Address address;//地址

}

@Entity
public class Address {
@Id
@Column(name = "id")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column(name = "phone")
private String phone;//手機

@Column(name = "zipcode")
private String zipcode;//郵政編碼

@Column(name = "address")
private String address;//地址
}

@OneToMany和@ManyToOne

注解一對多和多對一關系。

  • JPA使用@OneToMany和@ManyToOne來標識一對多的雙向關聯。一端(One)使用@OneToMany,多端(Many)使用@ManyToOne。
  • 在JPA規范中,一對多的雙向關系由多端(Many)來維護。就是說多端(Many)為關系維護端,負責關系的增刪改查。一端(One)則為關系被維護端,不能維護關系。
  • 一端(One)使用@OneToMany注釋的mappedBy屬性表明是關系被維護端。
  • 多端(Many)使用@ManyToOne和@JoinColumn來注釋屬性,@ManyToOne表明是多端,@JoinColumn設置在表中的關聯字段(外鍵)。

例子

  • 文章表 article (id,title,content,author_id)
  • 作者表 author (id,name)
@Entity
public class Author {

@Id
@Column(name = "id")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column
private String name;//姓名

//級聯保存、更新、刪除、刷新;延遲加載。當刪除用戶,會級聯刪除該用戶的所有文章
//擁有mappedBy注解的實體類為關系被維護端
//mappedBy="author"中的author是Article中的author屬性
@OneToMany(mappedBy = "author",cascade=CascadeType.ALL,fetch=FetchType.LAZY)
private List<Article> articleList;//文章列表
}

@Entity
public class Article {

@Id
@Column(name = "id")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column
private String title;

@Lob // 大對象,映射 MySQL 的 Long Text 類型
@Basic(fetch = FetchType.LAZY) // 懶加載
@Column(nullable = false)
private String content;//文章全文內容

//可選屬性optional=false,表示author不能為空。刪除文章,不影響用戶
@ManyToOne(cascade={CascadeType.MERGE,CascadeType.REFRESH},optional=false)
//設置在article表中的關聯字段(外鍵)
@JoinColumn(name="author_id")
private Author author;//所屬作者

}

@ManyToMany

注解多對多的關系。

角色和權限是多對多的關系。一個角色可以有多個權限,一個權限也可以被很多角色擁有。

JPA中使用@ManyToMany來注解多對多的關系,由一個關聯表來維護。這個關聯表的表名默認是:主表名+下劃線+從表名。

這個關聯表只有兩個外鍵字段,分別指向主表ID和從表ID。字段的名稱默認為:主表名+下劃線+主表中的主鍵列名,從表名+下劃線+從表中的主鍵列名。

例子

權限表 user_permission(id,permission_name)

角色表 user_role(id,department_id, create_time, description, name, update_time)

關聯表 user_role_permission 表(role_id, permission_id)

注意

多對多關系中一般不設置級聯保存、級聯刪除、級聯更新等操作。

本例中,由于加了@JoinTable注解,關聯關系表會按照注解指定的生成。否則去掉注解,指定Role為關系維護端,所以生成的關聯表名稱為:user_role_permission,關聯表的字段為:role_id 和permission_id。

@Data
@Entity
@Table(name = "user_permission")
public class Permission implements Comparable<Permission> {

@Id
@Column(name = "id")
private String id;

@Column(name = "permission_name")
private String permissionName;

@ManyToMany(mappedBy="permissions")
private Set<Role> roles;

}

@Data
@Entity
@Table(name = "user_role")
public class Role {

@Id
@Column(name = "id")
@GenericGenerator(name = "idGenerator", strategy = "uuid")
@GeneratedValue(generator = "idGenerator")
private String id;

@Column(name = "create_time")
private Long createTime;

@Column(name = "update_time")
private Long updateTime;

@Column(name = "name")
private String name;

@Column(name = "description")
private String description;

@Column(name = "department_id")
private String departmentId;

@ManyToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
@JoinTable(name = "user_role_permission", joinColumns = {@JoinColumn(name = "role_id")},
inverseJoinColumns = {@JoinColumn(name = "permission_id")})
private List<Permission> permissions;

}

小結

以上就是 JPA 實體類中的注解介紹,文中的例子僅僅淺嘗輒止,希望大家可以實際應用一下,后續我也會更深入的講解一些 JPA 的高級用法。

責任編輯:武曉燕 來源: Java技術指北
相關推薦

2023-12-07 09:07:58

2021-09-30 07:59:06

zookeeper一致性算法CAP

2019-08-16 09:41:56

UDP協議TCP

2021-05-07 07:52:51

Java并發編程

2022-03-29 08:23:56

項目數據SIEM

2024-08-27 11:00:56

單例池緩存bean

2017-03-30 22:41:55

虛擬化操作系統軟件

2023-09-25 08:32:03

Redis數據結構

2021-09-10 13:06:45

HDFS底層Hadoop

2023-10-04 00:32:01

數據結構Redis

2021-07-28 13:29:57

大數據PandasCSV

2023-11-07 07:46:02

GatewayKubernetes

2021-10-21 06:52:17

ZooKeeper分布式配置

2024-09-27 13:09:30

2018-09-26 11:02:46

微服務架構組件

2021-04-11 08:30:40

VRAR虛擬現實技術

2022-08-18 20:45:30

HTTP協議數據

2021-11-10 07:47:48

Traefik邊緣網關

2019-10-08 10:37:46

設計技術程序員

2021-12-13 10:43:45

HashMapJava集合容器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久艹免费视频 | 国产精品一区二区欧美 | 国产电影一区二区三区爱妃记 | 美女国内精品自产拍在线播放 | 亚洲www啪成人一区二区麻豆 | 亚洲狠狠爱 | 夜夜夜久久久 | 麻豆国产精品777777在线 | 男人的天堂在线视频 | 欧美一级在线 | 日韩成人免费视频 | 日本不卡一区 | 伊人网在线看 | 欧美精品一区二区免费视频 | 久久成人精品 | 亚洲美女一区二区三区 | 在线免费看黄 | 91精品国产一区二区三区 | 一二三四av | 日韩三区 | 九九热在线免费视频 | 成人在线观看免费观看 | 羞羞视频在线观看免费观看 | 日韩综合在线 | 久久久久久久国产 | 国产精品性做久久久久久 | 91社区视频 | 在线国产小视频 | 国产精品久久久久久久久久 | 久久国产精品免费一区二区三区 | 日本a v在线播放 | 免费一区二区三区在线视频 | 99re视频在线 | 国产91在线 | 亚洲 | 午夜影院普通用户体验区 | 久久99精品久久久久婷婷 | 午夜影院 | 日韩一区二区三区在线观看 | 网站黄色在线 | 亚洲精品久久久久中文字幕欢迎你 | 国产在线观看一区二区三区 |