JPA實體類中的註解
@Entity
標註於實體類上,通常和@Table是結合使用的,代表是該類是實體類
@Table
標註於實體類上,表示該類映射到數據庫中的表,沒有指定名稱的話就表示與數據庫中表名為該類的簡單類名的表名相對應,如果是逆向生成表的話就會以簡單類名作為表名
如果指定名稱,例如@Table(name="tb_user"),就表示映射到數據庫中的tb_userz這個表;
@Id
標註於屬性上,通常是在get方法上,也可以在屬性的聲明上。
用於表示該屬性作為ID主鍵
@GeneratedValue
主鍵生成策略,@GeneratedValue(strategy=GenerationType.AUTO)表示主鍵自增長由實現jpa的框架來控制,例如我們用hibernate實現的就是有hibernate來控制
GenerationType總共有四個:
AUTO:
TABLE:由一個表來維護主鍵,這個表記錄上一次生成的主鍵,然後+1給作為新的主鍵,這種方式效率比較低
SEQUENCE:根據底層數據庫的序列來生成主鍵,條件是數據庫支持序列
IDENTITY:主鍵增長有數據來維護,可能不同數據庫有不同的策略
@Column
標註於屬性上,有很多功能,例如指定長度、是否為空,列名以及對應到數據庫匯中的類型等,如@Column(length,nullable,name)
例如,我們string對應到數據庫中的text就可以這樣寫,@Column(columnDefinition="text")
@Temporal
指定時間類型,例如,@Temporal(TemporalType.Date)
@Enumerated(EmumType.STRING) 註解指定枚舉類型
其中,EmumTypes表示保存到數據庫中是索引還是字符串
@Lob聲明屬性對應的數據庫字段為大文本類型,可以存放大的數據(文本和字節)
@Transient不成為持久化字段及不跟數據庫中的字段形成映射
@Basic(fetch=FetchType.LAZY)
是否把數據裝載到內存中延遲初始化,第一次訪問的時候在加載數據,一般用在大數據存放
@Embeddable指定聯合組鍵 和@EmbeddedId結合使用
===================================================================
以上是針對實體的註解,接下來時針對實體與實體之間關聯的註解:
一對多
一般是在多的一般維護關系,也就是多的一方作為關系維護端,負責維護外鍵,而一的一方是不能操作外鍵的;
@oneToMany(cascade={CascadeType.*},fetch=FetchType.*,mappedBy="")
默認的FetchType.Lazy
mappedBy就是指關系被維護端;
多對一
@ManyToOne(cascade.CascadeType.*,optional=true|false)
@JoinColum(name="")--》維護關系(外鍵)
一般定義級聯保存、級聯查詢
默認為立即加載!
optional可選?也就是是否必須存在,false就是不允許為空。
一對一
@OneToOne(mapperBy="",cascade={CascadeType.*})
隨便一端都可以作為關系維護端
通過mapperBy指定為被維護端
fetch默認為立即加載
外鍵則在關系維護端定義
多對多
確定維護關系,都是通過中間表,這樣兩端就都是與中間表形成一對多!
關系被維護端:
@ManyToMany(cascade={CascadeType.*},mapperBy="itself")
關系維護端
@ManyToMany(cascade={CascadeType.*})
@JoinTable(name="",inverseJoinColums=@JoinColum(name=""),joinColum=@JoinColum(name=""))
其中,inverseJoinColums只關系被維護端的外鍵
joinColum指關系維護端本身的外鍵
總結
關系被維護端用mapperBy來定義關系
關系維護端用joinColum來指定外鍵名稱,維護外鍵或者是@JoinTable通過中間表維護關系
*ToOne 默認加載為立即加載
*ToMany 默認加載方式為懶加載
- @Entity
@Entity標記在類名上面,作為實體類的標識 - @Table
當實體類與其映射的數據庫表名不同名時需要使用 @Table 標註說明,該標註與 @Entity 標註並列使用,置於實體類聲明語句之前,可寫於單獨語句行,也可與聲明語句同行。
@Table 標註的常用選項是 name,用於指明數據庫的表名
@Table標註還有一個兩個選項 catalog 和 schema 用於設置表所屬的數據庫目錄或模式,通常為數據庫名。uniqueConstraints選項用於設置約束條件,通常不須設置。 - @Id
@Id設置對象表示符,標識的實體類的屬性映射對應表中的主鍵 - @GeneratedValue
設置標識符的生成策略,常與@Id一起使用
參數:strategy指定具體的生成策略
方式一:@GeneratedValue(strategy=GenerationType.AUTO) 也是默認策略, 即寫成@GeneratedValue也可;
類似於hibernate的native策略,生成方式取決於底層的數據庫。
方式二:@GeneratedValue(strategy = GenerationType.IDENTITY)指定“自動增長”策略,適用於MySQL;
方式三:@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = “seq_tbl_person”)指定“序列”策略,常用於Oracle,其中generator表示生成器的名字。而且還要指定@SequenceGenerator(name = “seq_tbl_person”, sequenceName = “seq_tbl_person”, allocationSize = 1)註解配合使用
其中name指定生成器的名字(與generator的值一樣),sequenceName指定數據庫中定義序列的名字,allocationSize指定序列每次增長1 - @Column
描述數據庫表中該字段的定義,具有一下屬性
name:表示數據庫表中該字段的名稱,默認情形屬性名稱一致。
nullable:表示該字段是否允許為null,默認為true。
unique:表示該字段是否是唯一標識,默認為false。
length:表示該字段的大小,僅對String類型的字段有效。
insertable:表示在ORM框架執行插入操作時,該字段是否應出現INSETRT語句中,默認為true。
updateable:表示在ORM框架執行更新操作時,該字段是否應該出現在UPDATE語句中,默認為true。對於一經創建就不可以更改的字段,該屬性非常有用,如對於birthday字段。
columnDefinition:表示該字段在數據庫中的實際類型。通常ORM框架可以根據屬性類型自動判斷數據庫中字段的類型,但是對於Date類型仍無法確定數據庫中字段類型究竟是DATE,TIME還是TIMESTAMP。此外,String的默認映射類型為VARCHAR,如果要將String類型映射到特定數據庫的BLOB或TEXT字段類型,該屬性非常有用。 - @OrderBy
在加載數據的時候可以為其指定順序。 - @Transient
表示該屬性並非一個到數據庫表的字段的映射,ORM框架將忽略該屬性。
如果一個屬性並非數據庫表的字段映射。就務必將其標示為@Transient。否則。ORM框架默認其註解為@Basic - @OneToOne
描述一個一對一的關聯
可選
fetch:表示抓取策略,默認為FetchType.LAZY
cascade:表示級聯操作策略 - @ManyToOne
表示一個多對一的映射,該註解標註的屬性通常是數據庫表的外鍵
optional:是否允許該字段為null,該屬性應該根據數據庫表的外鍵約束來確定,默認為true
可選
fetch:表示抓取策略,默認為FetchType.EAGER
cascade:表示默認的級聯操作策略,可以指定為ALL,PERSIST,MERGE,REFRESH和REMOVE中的若幹組合,默認為無級聯操作
targetEntity:表示該屬性關聯的實體類型。該屬性通常不必指定,ORM框架根據屬性類型自動判斷targetEntity。 - @OneToMany
描述一個一對多的關聯,該屬性應該為集體類型,在數據庫中並沒有實際字段。
fetch:表示抓取策略,默認為FetchType.LAZY,因為關聯的多個對象通常不必從數據庫預先讀取到內存
可選
cascade:表示級聯操作策略,對於OneToMany類型的關聯非常重要,通常該實體更新或刪除時,其關聯的實體也應當被更新或刪除
例如:實體User和Order是OneToMany的關系,則實體User被刪除時,其關聯的實體Order也應該被全部刪除 - @ManyToMany
描述一個多對多的關聯.多對多關聯上是兩個一對多關聯,但是在ManyToMany描述中,中間表是由ORM框架自動處理
可選
targetEntity:表示多對多關聯的另一個實體類的全名,例如:package.Book.class
mappedBy:表示多對多關聯的另一個實體類的對應集合屬性名稱
兩個實體間相互關聯的屬性必須標記為@ManyToMany,並相互指定targetEntity屬性,
需要註意的是,有且只有一個實體的@ManyToMany註解需要指定mappedBy屬性,指向targetEntity的集合屬性名稱
利用ORM工具自動生成的表除了User和Book表外,還自動生成了一個User_Book表,用於實現多對多關聯 - @JoinColumn
可選
@JoinColumn和@Column類似,介量描述的不是一個簡單字段,而一一個關聯字段,例如.描述一個@ManyToOne的字段.
name:該字段的名稱.由於@JoinColumn描述的是一個關聯字段,如ManyToOne,則默認的名稱由其關聯的實體決定.
例如,實體Order有一個user屬性來關聯實體User,則Order的user屬性為一個外鍵,
其默認的名稱為實體User的名稱+下劃線+實體User的主鍵名稱
@JoinTable(name = “student_teacher”, inverseJoinColumns = @JoinColumn(name = “tid”), joinColumns = @JoinColumn(name = “sid”))
可選
由第三張表來維護兩張表的關系
name:是關系表的名字
joinColumns:自己這一端的主鍵
inverseJoinColumns:對方的主鍵 - @MappedSuperclass
可選
@MappedSuperclass可以將超類的JPA註解傳遞給子類,使子類能夠繼承超類的JPA註解 - @Embedded
@Embedded將幾個字段組合成一個類,並作為整個Entity的一個屬性.
例如User包括id,name,city,street,zip屬性.
我們希望city,street,zip屬性映射為Address對象.這樣,User對象將具有id,name和address這三個屬性.
Address對象必須定義為@Embededable
JPA實體類中的註解