【轉載】hibernate基本註解(全)

類級別註解
  • @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,默認爲true
    unique: 可選,表示該字段是否爲唯一標識,默認爲false
    length: 可選,表示該字段的大小,僅對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
來源:慕課網
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章