一對多單向外鍵關聯
一對多就是一方持有多方的集合,一個班級有多個學生
需要在一方添加注解:
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
抓取政策一般采用的是懶加載
@JoinColumn(name=”cid”)
用來表示對應的外鍵的名稱
總結:多對一是,多方設定EAGER,一方設定LAZY
在前一個例子中,把Students類中的ClassRoom删掉,在ClassRoom(一方)中持有Students(多方)的集合。可以寫為
private Set<Students> stus;
,然後将字段封裝。在屬性上方加上注解。
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
@JoinColumn(name="cid")
private Set<Students> stus;
這樣配置就完成了。
然後在配置檔案裡配置一下兩個類。
測試類在之前的例子中修改,建立資料表的方法不變。在添加記錄的方法中,因為是一對多,一方持有多方的集合,是以在先建立好了班級和學生對象之後,先建立兩個集合。儲存的時候順序反過來,先儲存學生,再儲存班級。
@Test
public void addStudents() {
// 建立配置對象
Configuration config = new Configuration().configure();
// 建立服務注冊對象
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder()
.applySettings(config.getProperties()).buildServiceRegistry();
// 建立會話工廠對象
SessionFactory sessionFactory = config
.buildSessionFactory(serviceRegistry);
//建立會話對象
Session session = sessionFactory.getCurrentSession();
//建立事務對象
Transaction tx = session.beginTransaction();
//先建立班級對象
ClassRoom c1 = new ClassRoom("C001","計算機科學");
ClassRoom c2 = new ClassRoom("C002","物聯網工程");
//然後建立四個學生對象
Students s1 = new Students("張三", "男", new Date(), "計算機");
Students s2 = new Students("李四", "女", new Date(), "計算機");
Students s3 = new Students("王五", "女", new Date(), "計算機");
Students s4 = new Students("趙六", "男", new Date(), "計算機");
//建立兩個集合對象
Set<Students> set1 = new HashSet<Students>();
set1.add(s1);
set1.add(s2);
Set<Students> set2 = new HashSet<Students>();
set1.add(s3);
set1.add(s4);
c1.setStus(set1);
c2.setStus(set2);
//先儲存學生
session.save(s1);
session.save(s2);
session.save(s3);
session.save(s4);
//再儲存班級
session.save(c1);
session.save(c2);
tx.commit();
}
一對多(多對一)雙向外鍵關聯
多方:多方持有一方的引用
配置的注解有:
@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name=”cid”)
一方:一方持有多方的集合
配置的注解有:
@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY)
@JoinColumn(name=”cid”)
在前一個例子中,一方已經添加了多方的集合,隻需要在多方添加一方的引用。
private ClassRoom classRoom;
,然後對字段進行封裝。在get方法上加上注解。
@ManyToOne(cascade={CascadeType.ALL}, fetch=FetchType.EAGER)
@JoinColumn(name="cid")
public ClassRoom getClassRoom() {
return classRoom;
}
public void setClassRoom(ClassRoom classRoom) {
this.classRoom = classRoom;
}
修改配置文檔
<mapping class="otm_bfk.Students"/>
<mapping class="otm_bfk.ClassRoom"/>
在測試類中,由于是雙向的,是以無論先儲存學生還是先儲存班級都是可以的,是以之前的測試方法不需要修改。直接執行可以建立表和添加記錄。