HIberiante注解(二)

關(guān)系映射級別注解

一對一單向外鍵

  • @OneToOne(cascade=CascadeType.ALL)
  • @JoinColumn(name="pid", unique=true)

@OneToOne(cascade=)
表示級聯(lián)關(guān)系
@JoinColumn(name="pid", unique=true)
表示外鍵關(guān)聯(lián), 對應關(guān)聯(lián)類的列名

這里我們以學生和身份證號為模型,一個身份證號可以唯一的對應一個學生,一個學生有一個唯一的身份證號

@Entity
public class IDCard {

    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid", strategy="assigned")
    @Column(length=18)
    private String pid;     // 身份證號碼
    private String sname;   // 學生的姓名
}
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private Date birthday;
    
    @OneToOne(cascade=CascadeType.ALL)
    @JoinColumn(name="pid", unique=true)
    private IDCard idCard;
}

因為是Student中有一個指向IDCard表主鍵的字段pid,所以主控方是Student,所謂主控方就是能改變關(guān)聯(lián)關(guān)系的一方,Student只要改變pid就改變了關(guān)聯(lián)關(guān)系

一對一雙向外鍵

  1. 主控方的配置同一對一單向外鍵關(guān)聯(lián)
  2. @OneToOne(mappedBy="idCard") // 被控方

mappedBy中的屬性是,主控方中外鍵的屬性。
雙向關(guān)聯(lián),必須設置mappedBy屬性。因為雙向關(guān)聯(lián)只能交給一方去控制,不可能在雙方都設置外鍵保存關(guān)聯(lián)關(guān)系,否則雙發(fā)都無法保存。

@Entity
public class IDCard {

    @Id
    @GeneratedValue(generator="pid")
    @GenericGenerator(name="pid", strategy="assigned")
    @Column(name = "pid", length=18)
    private String pid;     // 身份證號碼
    private String sname;   // 學生的姓名
    
    @OneToOne(mappedBy="idCard")
    private Student student;
}

Student和上面一樣沒有任何改變

多對一單向外鍵

多方持有一方的引用, 比如:多個學生對應一個班級

@ManyToOne(cascade={CascadeType.All}, fetch=FetchType.EAGER)
fetch: 抓取策略。

@JoinColumn(name="cid", referencedColumnName="id")
name:多方外鍵的列名
referencedColumnName:一方主鍵的列名

/**
 * 教室,一的一方
 * @author whyalwaysmea
 */
@Entity
public class ClassRoom {

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

}
/**
 * 學生類,多的一方
 * @author whyalwaysmea
 */
@Entity
public class Student {

    @Id
    @GeneratedValue
    private int sid;
    private String sname;
    
    @ManyToOne(cascade= {CascadeType.ALL}, fetch=FetchType.EAGER)
    @JoinColumn(name="cid", referencedColumnName="id")
    private ClassRoom classRoom;
}

一對多單向外鍵

一方持有多方的集合,一個班級有多個學生

@OneToMany(cascade={CascadeType.All}, fetch=FetchType.LAZY)
@JoinColumn(name="cid")

多對多單向外鍵

學生和教師構(gòu)成多對多的關(guān)聯(lián)關(guān)系
其中一個多方持有另一個多方的集合對象(學生持有教室的集合)
創(chuàng)建中間表

@Entity
public class Teacher {

    @Id
    @GeneratedValue(generator="tid")
    @GenericGenerator(name="tid", strategy="uuid")
    private String tid;
    
    private String tname;
}
@Entity
public class Student {

    @Id
    @GeneratedValue(generator="sid")
    @GenericGenerator(name="sid", strategy="uuid")
    private String sid;
    
    private String sname;
    
    @ManyToMany
    @JoinTable(name = "teachers_students", 
            inverseJoinColumns = {@JoinColumn(name = "teacherId", referencedColumnName="tid")},
                    joinColumns = {@JoinColumn(name = "studentId", referencedColumnName="sid")} 
    )
    private Set<Teacher> teachers = new HashSet<>();
}

參考

代碼下載
Hibernate注解

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 使用注解的目的是簡化繁瑣的ORM映射文件(.hbm)的配置 JPA全稱是java Persistence API(...
    曹達興閱讀 2,593評論 0 5
  • 1.類級別注解 @Entity映射實體類 @Table映射數(shù)句庫表 @Entity(name="tableName...
    苗義閱讀 1,244評論 0 47
  • JPA Java Persistence API----java持久化接口 Hibernate注解分類 類級別注解...
    蕊er閱讀 625評論 0 2
  • 2017年8月21日 我原本只想簡單記錄一下springboot中應用Jpa的簡單操作。不想由于hibernate...
    行者N閱讀 6,736評論 0 23
  • 這樣的朋友就該拉黑名單 所謂朋友大約是那些你認為 在這個世界上和你最相近的人。 你們有一樣的目標 有相似的人生經(jīng)歷...
    Tuka_圖卡閱讀 579評論 0 6

友情鏈接更多精彩內(nèi)容