-
@Entity映射實體類
@Entity(name="tableName")name:可選,對應數據庫中的一個表。若表名與實體類名相同,則可以省略
注意:使用@Entity時必須指定實體類的主鍵屬性
- @Table
@Table(name="",catalog="",schema="")
@Entity配合使用,只能標註在實體的class定義處,表示實體對應的數據庫表的信息。
name:可選,映射表的名稱,默認表名和實體名稱一致,只有在不一致的情況下才需要指定表名。
catalog 可選,表示Catalog名稱,默認爲Catalog("")
schema - 可選,表示Schema名稱,默認爲Schema("").
各種數據庫系統對Catalog和Schema的支持和實現方式千差萬別
- Embeddable
@Embeddable表示一個非Entity類可以嵌入到另一個Entity類中作爲屬性而存在。例如:employee類中有個department屬性,而departtent是個類
@Entity
public class Employee{
private Department dp;
}
@Embeddable
public class Department{
}
屬性級別註解
添加到屬性字段上面或者get訪問器上必須統一
-
@Id
必須,定義了映射到數據庫表的主鍵的屬性,一個實體類可以有一個或者多個屬性被映射爲主鍵,
可置於主鍵屬性或者getXxx()前,注意:如果有多個屬性定義爲主鍵屬性,該實體類必須實現serializable接口 - @SequenceGenerator
-
@GeneratedValue
@GeneratedValue(strategy=GenerationType,generator=""):可選,用於定義主鍵生成策略
strategy表示主鍵生成策略,取值有:
GenerationType.AUTO
:根據底層數據庫自動選擇(默認)GenerationType.INDENTITY
:根據數據庫的Identity字段生成GenerationType.SEQUENCE
:使用Sequence來決定主鍵的取值GenerationType.TABLE
:使用指定表來決定主鍵取值,結合@TableGenerator使用 -
@Column
@Column-可將屬性映射到列,使用該註解來覆蓋默認值,@Column描述了數據庫表中該字段的詳細定義,這對於根據JPA註解生成數據庫表結構的工具非常有作用。
常用屬性:name:可選
,表示數據庫表中該字段的名稱,默認情形屬性名稱一致nullable
: 可選,表示該字段是否允許爲null,默認爲trueunique
: 可選,表示該字段是否爲唯一標識,默認爲falselength
: 可選,表示該字段的大小,僅對String類型的字段有效,默認值225,主鍵不能使用默認值insertable
: 可選,表示在ORM框架執行插入操作時,該字段是否應出現INSERTRT語句中,默認爲true
updateable: 可選,表示在ORM框架執行更新操作時,該字段是否應該出現在
UPDATE語句中,默認爲true。對於已經創建
就不可以更改的字段,該屬性非常有用 -
@Enbedded
@Embedded是註釋屬性的,表示該屬性的類是嵌入類。
注意:同時嵌入類也必須標註@Embeddable註解 - @EnbeddedId
@EmbeddedId使用嵌入式主鍵類實現複合主鍵
注意:嵌入式主鍵類必須實現Serializable接口、必須有默認的public無參數的構造方法、必須覆蓋equals和hashCode方法 -
@Lob
@Lob註解表示屬性將被持久化爲Blob或者Clob類型, 具體取決於屬性的類型
- @Version
@Version註解來發現數據庫記錄的併發操作。當JPA運行時檢測到一個併發操作也在試圖更改同一條記錄。它會拋出一個嘗試提交的事務異常。
- @Basic
但對於一些特殊的屬性,比如長文本型text、字節流型blob型的數據,在加載Entity時,這些屬性對應的數據量比較大,有時創建實體時如果也加載的話,可能嚴重造成資源的佔用。要想解決這些問題,此時就需要設置實體屬性的加載方式爲惰性加載(LAZY)。
@javax.persistence.Basic(fetch=FetchType.LAZY,optional=true)
fetch:抓取策略,延時加載與立即加載 - @transient
表示該屬性並非一個到數據庫表的字段映射,ORM 框架將忽略該屬性,ORM 默認爲@Basic
-
一對一單向關外鍵
public class Student{ private String id; private IdCard idCard; ... @OneToOne(cascade=CascadeType.ALL) // 級聯關係(數據同步,刪除一邊,另一邊也刪除等) @JoinColumn(name="cid",unique=true) // 外鍵名稱 public IdCard setIdCard(){ this.idCard = idCard; } } } public class IdCard{ private String iid; ... }
-
一對一雙向外鍵
注意 :雙向關聯只能交給一方去控制,不可能雙方都保存關聯關係
public class Student{
private String id;
private IdCard card;
...
@OneToOne(cascade=CascadeType.ALL) // 級聯關係(數據同步,刪除一邊,另一邊也刪除等)
@JoinColumn(name="cid",unique=true) // 外鍵名稱
public IdCard setCard(){
this.idCard = idCard;
}
}
}
public class IdCard{
private String iid;
private Student student;
@OneToOne(mappedBy("card")) //card是指Student.card
public Student setStudent(){
}
...
}
- 多對一(一對多)單向外鍵:多方持有一方的引用
public class Student{
private String id;
private ClassRoom classRoom;
...
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //級聯關係,抓取規則
// @JoinColumn中的name爲當前類的屬性名,(多對一單向,有多方維護)所以,name爲student中的cid,而ReferenceColumnName爲引用表的列(多對一單向,所以爲一方的引用列)即ClassRoom中的主鍵列
@JoinColumn(name="cid",referencedColumnName="CID")
public CLassRoom setClassRoom(ClassRoom classRoom){
this.classRoom = classRoom;
}
}
public class ClassRoom{
private String cid;
...
}
- 多對一(一對多)雙向外鍵:多方持有一方的引用,一方持有多方的集合
student不變
public class Student{
private String id;
private ClassRoom classRoom;
...
@ManyToOne(cascade={CascadeType.ALL},fetch=FetchType.EAGER) //級聯關係,抓取規則
// name爲ClassRoom.cid
@JoinColumn(name="cid")
public CLassRoom setClassRoom(ClassRoom classRoom){
this.classRoom = classRoom;
}
}
}
// ClassRoom添加
public class ClassRoom{
private String cid;
private Map<String,Student> student;
@OneToMany(cascade={CascadeType.ALL},fetch=FetchType.LAZY) //級聯關係,抓取規則
@JoinColumn(name="cid")
public Map<String,Student> getStudent(){
}
...
}
- 多對多單向關聯
Teacher類中
@ManyToMany
@JoinTable(name="student_teacher",//中間表名
joinColumns=@JoinColumn(name="teacher_id"),//這個類在表中的id
inverseJoinColumns=@JoinColumn(name="student_id")//反轉的類在聯合表中的id
)
public Set<Student> getStudentSet() {
return studentSet;
}
-
多對多雙向關聯
Teacher類
@ManyToMany @JoinTable(name="student_teacher", joinColumns=@JoinColumn(name="teacher_id"),//這個類在表中的id inverseJoinColumns=@JoinColumn(name="student_id")//反轉的類在聯合表中的id ) public Set<Student> getStudentSet() { return studentSet; } Student類 @ManyToMany(mappedBy="studentSet") public Set<Teacher> getSet() { return set; }
作者: 心似一片青苔
鏈接:http://www.imooc.com/article/17686
來源:慕課網