(6)hibernate中ManyToOne單向
阿新 • • 發佈:2018-12-13
many2one:在many一方新增外來鍵,比如classroom和student,就在student這一方新增外來鍵
先新增1:
void test() { Session s=null; try { s=HibernateUtil.getSession(); s.beginTransaction(); Classroom cla=new Classroom(); cla.setGrade(2017); cla.setName("計算機"); s.save(cla); Student stu1=new Student(); stu1.setName("test01"); stu1.setNumber(1); stu1.setCla(cla); s.save(stu1); Student stu2=new Student(); stu2.setName("test02"); stu2.setNumber(2); stu2.setCla(cla); s.save(stu2); s.getTransaction().commit(); } catch (Exception e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); s.getTransaction().rollback(); }finally { HibernateUtil.closeSession(s); } }
發3條sql
先新增多:
void test01() { Session s=null; try { s=HibernateUtil.getSession(); s.beginTransaction(); Student stu1=new Student(); stu1.setName("test01"); stu1.setNumber(1); s.save(stu1); Student stu2=new Student(); stu2.setName("test02"); stu2.setNumber(2); s.save(stu2); Classroom cla=new Classroom(); cla.setGrade(2017); cla.setName("計算機"); s.save(cla); stu1.setCla(cla); stu2.setCla(cla); s.getTransaction().commit(); } catch (Exception e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); s.getTransaction().rollback(); }finally { HibernateUtil.closeSession(s); } }
發5條sql(3條save 2條update),stu1和stu2在save之後就變為持久化狀態了,之後在commit發現物件與session快取物件不同(stu1和stu2後來設定了classroom),則發2條update進行修改
void test02() { Session s=null; try { s=HibernateUtil.getSession(); s.beginTransaction(); Student stu=(Student)s.load(Student.class, 13); System.out.println(stu.getNumber()); System.out.println(stu.getName()); System.out.println(stu.getCla().getName()); s.getTransaction().commit(); } catch (Exception e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); s.getTransaction().rollback(); }finally { HibernateUtil.closeSession(s); } }
獲取stu的Number以及Name,由於延遲載入,只需要一條sql,獲取cla的name時,就得再發一條sql
void test03() {
Session s=null;
try {
s=HibernateUtil.getSession();
s.beginTransaction();
Classroom cla=new Classroom();
cla.setGrade(2017);
cla.setName("計算機");
Student stu1=new Student();
stu1.setName("test01");
stu1.setNumber(1);
stu1.setCla(cla);
s.save(stu1);
Student stu2=new Student();
stu2.setName("test02");
stu2.setNumber(2);
stu2.setCla(cla);
s.save(stu2);
s.getTransaction().commit();
} catch (Exception e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
s.getTransaction().rollback();
}finally {
HibernateUtil.closeSession(s);
}
}
注意:(1).cla不進行save,資料庫沒有cla的資料,在新增student沒有外來鍵,就會丟擲異常,在many-to-one設定cascade=“all”,如果新增資料庫沒有關聯物件(比如有student卻沒有classroom的資料),則會自動建立classroom,完成關聯
void test04() {
Session s=null;
try {
s=HibernateUtil.getSession();
s.beginTransaction();
Student stu1=s.load(Student.class, 1);
s.delete(stu1);
s.getTransaction().commit();
} catch (Exception e) {
// TODO 自動生成的 catch 塊
e.printStackTrace();
s.getTransaction().rollback();
}finally {
HibernateUtil.closeSession(s);
}
}
注意:(1).刪除stu也會自動刪除關聯物件classroom,但是由於classroom還有stu在關聯,所以會報錯
總結:如果沒有特殊情況不要使用cascade,特殊需求才使用cascade的add,正常的add都需要程式設計師手動完成的,還有一種情況可以使用cascade,在一的一方進行刪除(classroom),則會把關聯的stu全都刪除,但是一般情況還是手動刪除較為合適。