Bài giảng Lập trình Java 4 - Bài 7: Hibernate Mapping

pdf 73 trang Hùng Dũng 04/01/2024 1110
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình Java 4 - Bài 7: Hibernate Mapping", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfbai_giang_lap_trinh_java_4_bai_7_hibernate_mapping.pdf

Nội dung text: Bài giảng Lập trình Java 4 - Bài 7: Hibernate Mapping

  1. Bài 7: Hibernate Mapping
  2. Nôi dung bài học . Many - to - One . One to One . One to Many . Many to Many 2
  3. Mapping Many To One Lớp Học sinh - MaHocSinh: Int - MaLop: String 1 * - TenLop: String - TenHocSinh: Str - MaLop: Str • Một học sinh thuộc về 1 lớp. • Một lớp có nhiều học sinh. 3
  4. Many to one: LopPOJO 1 package pojo; 2 3 public class LopPojo implements java.io.Serializable { 4 private String maLop; 5 private String tenLop; 6 } //Các phương thức set, get, constructor 4
  5. Many to one: Lop.hbm.xml 1 2 5 6 7 8 9 10 11 12 13 14 15 . 5
  6. Many to one: HocSinhPOJO 1 package pojo; 2 3 public class HocSinhPojo implements java.io.Serializable { 4 private int maHocSinh; 5 private String tenHocSinh; 6 private LopPojo lop; //Các phương thức get, set, constructor. } 6
  7. Many to one: HocSinh.hbm.xml 1 2 3 4 5 6 8 9 10 11 12 Tên lớp cần mapping tới Tên cột trong table HocSinh 7
  8. Lấy thông tin học sinh 1 public class Main { 2 public static void main(String[] args) { 3 HocSinhPojo hs = null; 4 SessionFactory ssFac = MyHibernateUtil.getSessionFactory(); 5 Session ss = ssFac.openSession(); 6 ss.getTransaction().begin(); 7 try { 8 hs = (HocSinhPojo)ss.get(HocSinhPojo.class, 1); 9 System.out.println("Tên học sinh: " + hs.getTenHocSinh()); 10 System.out.println("Mã lớp: " + hs.getLop().getMaLop()); 11 System.out.println("Tên lớp: " + hs.getLop().getTenLop()); 12 } catch (HibernateException ex ) { 13 System.out.println(ex.getMessage()); 14 } 15 finally 16 { 17 ss.close(); 18 } 19 } 20 } Lấy thông tin học sinh khi còn mở Session Thành công 8
  9. Lấy thông tin học sinh 1 public class Main { 2 public static void main(String[] args) { 3 HocSinhPojo hs = null; 4 SessionFactory ssFac = MyHibernateUtil.getSessionFactory(); 5 Session ss = ssFac.openSession(); 6 ss.getTransaction().begin(); 7 try { 8 hs = (HocSinhPojo)ss.get(HocSinhPojo.class, 1); 9 } catch (HibernateException ex ) { 10 System.out.println(ex.getMessage()); 11 } 12 finally 13 { 14 ss.close(); 15 } 16 System.out.println("Tên học sinh: " + hs.getTenHocSinh()); 17 System.out.println("Mã lớp: " + hs.getLop().getMaLop()); 18 System.out.println("Tên lớp: " + hs.getLop().getTenLop()); 19 } 20 } Lấy thông tin học sinh sau khi đóng Session chỉ lấy được tên và mã học sinh, không lấy được tên lớp. Lỗi 9
  10. Lấy thông tin học sinh Lấy thông tin học sinh sau khi đóng Session chỉ lấy được tên và mã học sinh, không lấy được tên lớp. Lỗi 10
  11. Lấy thông tin học sinh 1 public class Main { 2 public static void main(String[] args) { 3 HocSinhPojo hs = null; 4 SessionFactory ssFac = MyHibernateUtil.getSessionFactory(); 5 Session ss = ssFac.openSession(); 6 ss.getTransaction().begin(); 7 try { 8 hs = (HocSinhPojo)ss.get(HocSinhPojo.class, 1); 9 System.out.println("Tên lớp: " + hs.getLop().getTenLop()); 10 } catch (HibernateException ex ) { 11 System.out.println(ex.getMessage()); 12 } 13 finally 14 { 15 ss.close(); 16 } 17 System.out.println("Tên học sinh: " + hs.getTenHocSinh()); 18 System.out.println("Mã lớp: " + hs.getLop().getMaLop()); 19 } 20 } Thành công 11
  12. Lấy thông tin học sinh . Nguyên nhân lỗi: • Cơ chế Lazy Initialization đang được bật (= true) Truy vấn đối tượng HocSinh sẽ không kèm theo truy vấn đối tượng Lop. (chỉ có thể truy vấn được mã lớp mà không truy vấn được tên lớp). Truy vấn đối tượng cha sẽ không kèm theo truy vấn đối tượng con. 12
  13. Lazy Initialization & fetch . Trong Hibernate, Lazy Initialization giúp • Tránh các câu truy vấn cơ sở dữ liệu không cần thiết • Gia tăng hiệu suất thực thi • Lazy mặc định có giá trị là true 13
  14. Cách 1 . Sau khi có mã lớp, ta dùng làm lấy thông tin lớp theo mã lớp LopDAO.layThongTinLop(int maLop); 14
  15. Cách 2 – Khai báo lazy = false trong Hocsinh.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 15
  16. Cơ chế fetch . Lazy =“false” truy vấn lớp cha kèm theo truy vấn lớp con. • Fetch = “select” sử dụng select để truy vấn lớp con. sử dụng 2 câu truy vấn select để truy vấn cả lớp cha và con, cách này không hiệu quả vì phải truy xuất tới cơ sở dữ liệu 2 lần. • Fetch = “join” sử dụng phép kết để gọp truy vấn lớp cha và lớp con trong 1 truy vấn. hiệu suất cao hơn, sử dụng 1 câu truy vấn. 16
  17. Cơ chế fetch – sử dụng select Hocsinh.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 Chú ý: mỗi khi sữa lại file cấu hình xml (cấu hình hibernate, cấu hình mapping, Phải clean and built lại project thì thay đổi mới có hiệu lực. 17
  18. Cơ chế fetch – sử dụng select Hocsinh.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 Chú ý: mỗi khi sữa lại file cấu hình xml (cấu hình hibernate, cấu hình mapping, ) Phải clean and built lại project thì thay đổi mới có hiệu lực. 18
  19. Cơ chế fetch – sử dụng select Bản chất, các câu truy vấn HQL đều được chuyển về SQL, như hình dưới có 2 câu select được gọi.  truy xuất CSDL 2 lần 2 câu truy vấn select được gọi. 19
  20. Cơ chế fetch – sử dụng join Hocsinh.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 Chú ý: mỗi khi sữa lại file cấu hình xml (cấu hình hibernate, cấu hình mapping, ) Phải clean and built lại project thì thay đổi mới có hiệu lực. 20
  21. Cơ chế fetch – sử dụng join 1 public class Main { 2 public static void main(String[] args) { 3 HocSinhPojo hs = null; 4 SessionFactory ssFac = MyHibernateUtil.getSessionFactory(); 5 Session ss = ssFac.openSession(); 6 ss.getTransaction().begin(); 7 try { 8 String hql="select hs 9 from HocSinhPojo hs left join fetch hs.lop 10 where hs.maHocSinh=:maHocSinh"; 11 Query query=ss.createQuery(hql); 12 query.setInteger("maHocSinh", 1); 13 hs = (HocSinhPojo) query.uniqueResult(); 14 } catch (HibernateException ex) { 15 System.out.println(ex.getMessage()); 16 } finally { 17 ss.close(); 18 } 19 System.out.println("Tên họccsinh: " + hs.getTenHocSinh()); 20 System.out.println("Mã danh mục: " + hs.getLop().getMaLop()); 21 System.out.println("Tên danh mục: " + hs.getLop().getTenLop()); 22 } 23 } 21
  22. Cơ chế fetch – sử dụng join Có 1 câu select được gọi, có sử dụng phép Join  truy xuất CSDL 2 lần 1 câu truy vấn select được gọi. 22
  23. Cascade • Save – update • Delete 23
  24. Cascade – None cascade 1 2 3 4 5 6 7 9 10 11 Mặc định nếu không khai báo thì cascade=none 24
  25. Cascade – không dùng update-save 1 public static void main(String[] args) { 2 HocSinhPojo hs = new HocSinhPojo(15, "Trần Văn Đạt", null); 3 LopPojo lop = new LopPojo("12E", "Lớp 12 chuyên Hóa"); 4 5 hs.setLop(lop); 6 if(HocSinhDAO.themHocSinh(hs)) 7 { 8 System.out.println("Thêm thành công!"); 9 } 10 else 11 System.out.println("Thêm th?t b?i!"); } LỖI Lớp 12E không tồn tại trong cơ sở dữ liệu. 25
  26. Cascade – sử dụng update-save HocSinh.hbm.xml 1 2 3 4 5 6 7 10 11 26
  27. Cascade – sử dụng update-save 1 public static void main(String[] args) { 2 HocSinhPojo hs = new HocSinhPojo(15, "Trần Văn Đạt", null); 3 LopPojo lop = new LopPojo("12E", "Lớp 12 chuyên Hóa"); 4 5 hs.setLop(lop); 6 if(HocSinhDAO.themHocSinh(hs)) 7 { 8 System.out.println("Thêm thành công!"); 9 } 10 else 11 System.out.println("Thêm thất bại!"); } THÊM THÀNH CÔNG 27
  28. Cascade – không dùng delete 1 public class Main { 2 public static void main(String[] args) { 3 if(LopDAO.xoaLop("12E")) 4 System.out.println("Xóa thành công!"); 5 else 6 System.out.println("Xóa th?t b?i!"); 7 } 8 } LỖI Không thể xóa lớp 12E lỗi tham chiếu khóa ngoại 28
  29. Cascade – sử dụng delete CHÚ Ý Để dùng Cascade trong hibernate phải cho phép sử dụng cascade trong CSDL 29
  30. Cascade – sử dụng delete 1 2 3 4 5 6 7 10 11 30
  31. Cascade – sử dụng delete 1 public class Main { 2 public static void main(String[] args) { 3 if(LopDAO.xoaLop("12E")) 4 System.out.println("Xóa thành công!"); 5 else 6 System.out.println("Xóa thất bại!"); 7 } 8 } XÓA THÀNH CÔNG 31
  32. Mapping One To Many Lớp Học sinh - MaHocSinh: Int - MaLop: String 1 * - TenLop: String - TenHocSinh: Str - MaLop: Str • Một học sinh thuộc về 1 lớp. • Một lớp có nhiều học sinh. 32
  33. LopPOJO 1 package pojo; 2 3 import java.util.HashSet; 4 import java.util.Set; 5 6 public class LopPojo implements java.io.Serializable { 7 private String maLop; 8 private String tenLop; 9 private Set danhSachHocSinh = new HashSet (0); 10 11 // Các phương thức get, set, construction 12 13 } 33
  34. Lop.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 34
  35. HocSinhPOJO 1 package pojo; 2 3 public class HocSinhPojo implements java.io.Serializable { 4 private int maHocSinh; 5 private String tenHocSinh; 6 private LopPojo lop; //Các phương thức get, set, constructor. } 35
  36. HocSinh.hbm.xml 1 2 3 4 5 6 8 9 10 11 12 36
  37. DAO: Lấy thông tin lớp học 1 public static LopPojo layThongTinLop(String maLop) { 2 LopPojo lop = null; 3 SessionFactory ssFac = MyHibernateUtil.getSessionFactory(); 4 Session ss = ssFac.getCurrentSession(); 5 Transaction trans = ss.getTransaction(); 6 trans.begin(); 7 try { 8 lop = (LopPojo)ss.get(LopPojo.class, maLop); 9 trans.commit(); 10 } catch (HibernateException ex ) { 11 System.out.println(ex.getMessage()); 12 } 13 return lop; 14 } 37
  38. Lấy thông tin lớp học 1 public class Main { 2 public static void main(String[] args) { 3 LopPojo lop = LopDAO.layThongTinLop("10A"); 4 System.out.println("Mã lớp: " + lop.getMaLop()); 5 System.out.println("Tên lớp: " + lop.getTenLop()); 6 System.out.println(" "); 7 Iterator dsHocSinh = 8 lop.getDanhSachHocSinh().iterator(); 9 10 while(dsHocSinh.hasNext()) 11 { 12 HocSinhPojo hs = dsHocSinh.next(); 13 System.out.println("Mã học sinh: " + hs.getMaHocSinh()); 14 System.out.println("Tên học sinh: " + 15 hs.getTenHocSinh()); 16 System.out.println("___"); 17 } 18 } 19 } 20 38
  39. Lấy thông tin lớp học Kết quả 39
  40. INVERSER Khi tạo mới hay thay đổi thông tin “một lớp học” thì có cần phải cập nhật lại “mã lớp” của học sinh hay không? 40
  41. Inverser - False Lưu ý: để xuất câu truy vấn SQL ra console cho tiện việc xem xét như các slide bên dưới ta phải thêm true vào file cấu hình hibernate.cfg.xml. 1 2 3 org.hibernate.dialect.MySQLDialect 4 com.mysql.jdbc.Driver 6 jdbc:mysql://localhost:3306/quanlysach?use 8 Unicode=true&characterEncoding=UTF-8 9 root 10 password thread 12 true 13 14 15 41
  42. Inverser - False Khi tạo mới hay thay đổi thông tin “một lớp học” thì có cần phải cập nhật lại “mã lớp” của học sinh hay không? • Nếu inverser = false (Mặc định) 1 3 4 5 6 7 Inverser = false đồng nghĩa với LopHoc đóng vai trò chủ đạo trong mối quan hệ LopHoc-HocSinh, vì vậy khi tạo mới hay cập nhật thông tin một lớp học sẽ phải cập nhật lại mã lớp của học sinh. 42
  43. Inverser - FALSE 1 public class Main { 2 public static void main(String[] args) { 3 Session session=MyHibernateUtil.getSessionFactory().getCurrentSession(); 4 session.beginTransaction(); 5 6 LopPojo lop = new LopPojo("12F", "Lớp 12 chuyên văn"); 7 HocSinhPojo hs = new HocSinhPojo(6, "Mạc Thị Bưởi", lop); 8 9 lop.getDanhSachHocSinh().add(hs); 10 11 session.save(lop); session.save(hs); 12 session.getTransaction().commit(); 13 } 14 } 43
  44. Inverser - TRUE Hibernate: insert into Có 3 câu truy vấn lop SQL được sử dụng. (TenLop, MaLop) values (?, ?) Hibernate: insert into hocsinh (TenHocSinh, MaLop, MaHocSinh) Có 2 câu insert dữ liệu values Có 1 câu update dùng để (?, ?, ?) Update Hibernate: lại mã lớp của học sinh. update Trong trường hợp này câu hocsinh update set không cần thiết. MaLop=? where MaHocSinh=? BUILD SUCCESSFUL (total time: 1 second) 44
  45. Inverser Khi tạo mới hay thay đổi thông tin “một lớp học” thì có cần phải cập nhật lại “mã lớp” của học sinh hay không? • Nếu inverser = true 1 3 4 5 6 7 Inverser = true đồng nghĩa với HocSinh đóng vai trò chủ đạo trong mối quan hệ này, vì vậy khi tạo mới hay cập nhật thông tin một lớp học sẽ không cần phải cập nhật lại mã lớp của học sinh. 45
  46. Inverser - TRUE 1 public class Main { 2 public static void main(String[] args) { 3 Session session=MyHibernateUtil.getSessionFactory().getCurrentSession(); 4 session.beginTransaction(); 5 6 LopPojo lop = new LopPojo("12F", "Lớp 12 chuyên văn"); 7 HocSinhPojo hs = new HocSinhPojo(6, "Mạc Thị Bưởi", lop); 8 9 lop.getDanhSachHocSinh().add(hs); 10 11 session.save(lop); session.save(hs); 12 session.getTransaction().commit(); 13 } 14 } 46
  47. Inverser - TRUE Hibernate: insert into lop (TenLop, MaLop) values (?, ?) Chỉ có 2 câu insert Hibernate: được sử dụng. insert into hocsinh (TenHocSinh, MaLop, MaHocSinh) values (?, ?, ?) BUILD SUCCESSFUL (total time: 1 second) Bớt được một truy vấn đến CSDL tăng hiệu năng đáng kể. 47
  48. Many to many . Quan hệ Many – Many: • Một sinhvien có thể học nhiều lophoc. • Một lophoc có nhiều sinhvien. 48
  49. LopHocPOJO & SinhVienPOJO 1 public class LopHocPOJO implements java.io.Serializable { 2 private String maLopHoc; 3 private String tenLopHoc; 4 private int soTinChi; 5 private Set dsSinhVien = new HashSet (); 6 //Các phương thức set, get, constructor } 1 public class SinhVienPOJO implements java.io.Serializable { 2 private String maSinhVien; 3 private String tenSinhVien; 4 private int namSinh; 5 private Set dsLopHoc = new HashSet (); 6 //Các phương thức set, get, constructor } 49
  50. Mapping: SinhVien.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 50
  51. Mapping: LopHoc.hbm.xml 1 2 3 4 5 6 7 8 9 10 11 51
  52. SinhVienDAO 1 public static List layDsSinhVien() { 2 List list = null; 3 SessionFactory sf = MyHibernateUtil.getSessionFactory(); 4 Session ss = sf.getCurrentSession(); 5 Transaction trans = ss.beginTransaction(); 6 try { 7 trans.begin(); 8 list = ss.createQuery("from pojo.SinhVienPOJO").list(); 9 trans.commit(); 10 } catch (Exception ex) { 11 System.out.append(ex.getMessage()); 12 } 13 return list; 14 } 52
  53. App 1 List list = dao.SinhVienDAO.layDsSinhVien(); 2 for (int i = 0; i < list.size(); ++i) { 3 System.out.println(list.get(i).getMaSinhVien() + "-" 4 + list.get(i).getTenSinhVien() + "-" 5 + list.get(i).getNamSinh()); 6 } 53
  54. App 1 List list = dao.SinhVienDAO.layDsSinhVien(); 2 for (int i = 0; i dsLop = list.get(i).getDsLopHoc().iterator(); 7 while (dsLop.hasNext()) { 8 LopHocPOJO lh = dsLop.next(); 9 System.out.println(lh.getMaLopHoc() + 10 "-" + lh.getTenLopHoc() + 11 "-" + lh.getSoTinChi()); ??? 12 } 13 } 54
  55. App . Cách giải quyết: • Điều chỉnh thuộc tính lazy trong file mapping. • Mặc định lazy = “true” 1 2 3 4 55
  56. Lazy Initialization & fetch . Lazy = “true” truy vấn lớp cha sẽ không kèm theo truy vấn lớp con . Lazy =“false” truy vấn lớp cha kèm theo truy vấn lớp con. • Fetch = “select” sử dụng select để truy vấn lớp con. sử dụng 2 câu truy vấn, làm chậm tốc độ. • Fetch = “join” sử dụng phép kết để gọp truy vấn lớp cha và lớp con trong 1 truy vấn. 56
  57. Lazy Initialization & fetch . Trong Hibernate, Lazy Initialization giúp • Tránh các câu truy vấn cơ sở dữ liệu không cần thiết • Gia tăng hiệu suất thực thi • Lazy mặc định có giá trị là true 57
  58. App 1 List list = dao.SinhVienDAO.layDsSinhVien(); 2 for (int i = 0; i dsLop = list.get(i).getDsLopHoc().iterator(); 7 while (dsLop.hasNext()) { 8 LopHocPOJO lh = dsLop.next(); 9 System.out.println(lh.getMaLopHoc() + 10 "-" + lh.getTenLopHoc() + 11 "-" + lh.getSoTinChi()); 12 } 13 } Kết quả sau khi chạy lại đoạn code. 58
  59. SinhVienDAO 1 public static boolean dangKyLop(SinhVienPOJO info) { 2 boolean kq = true; 3 SessionFactory sf = MyHibernateUtil.getSessionFactory(); 4 Session ss = sf.getCurrentSession(); 5 Transaction trans = ss.beginTransaction(); 6 try { 7 trans.begin(); 8 ss.saveOrUpdate(info); 9 trans.commit(); 10 } catch (Exception ex) { 11 kq = false; 12 System.out.append(ex.getMessage()); 13 } 14 return kq; 15 } 59
  60. App 1 SinhVienPOJO sv = dao.SinhVienDAO.layThongTinSinhVien("SV03"); 2 sv.getDsLopHoc().add(new LopHocPOJO("CTT03", “Java phân tán", 4)); 3 dao.SinhVienDAO.dangKyLop(sv); Trong CSDL không tồn tại sẵn lophoc có mã là CTT03 như lúc thêm 60
  61. Cascade . Cách giải quyết: • Điều chỉnh thuộc tính cascade trong file mapping. • Cascade có 2 giá trị: save-update / delete • Nếu dùng cả 2 giá trị thì cách nhau bằng dấu , 1 3 4 61
  62. App 1 SSinhVienPOJO sv = dao.SinhVienDAO.layThongTinSinhVien("SV03"); 2 sv.getDsLopHoc().add(new LopHocPOJO("CTT03", "Java phân tán", 4)); 3 boolean kq = dao.SinhVienDAO.dangKyLop(sv); 4 if (kq) 5 System.out.println("Thêm thành công"); 6 else 7 System.out.println("Thêm thất bại"); 62
  63. One to One . Quan hệ One – One: • Một sinhvien có duy nhất một cmnd. • Một cmnd thuộc về duy nhất một sinhvien. 63
  64. SinhVienPOJO & cmndPOJO 1 public class SinhVienPOJO implements java.io.Serializable { 2 private String maSinhVien; 3 private cmndPOJO cmnd; 4 //Các phương thức set, get, constructor 5 } 1 public class cmndPOJO implements java.io.Serializable { 2 private String cmnd; 3 private String hoTen; 4 private SinhVienPOJO sinhVien; 5 //Các phương thức set, get, constructor 6 } 64
  65. Mapping . Mapping mối quan hệ một-một giống như mapping mối quan hệ nhiều-một: • Nhưng thêm thuộc tính unique=“true” . Có thể khai báo sử dụng thuộc tính: • Lazy • Fetch • Cascade 65
  66. Mapping: SinhVien.hbm.xml 1 2 3 4 6 7 8 9 66
  67. Mapping: cmnd.hbm.xml 1 2 3 4 5 7 8 67
  68. SinhVienDAO 1 public static List layDanhSachSinhVien() { 2 List list = null; 3 SessionFactory sf = MyHibernateUtil.getSessionFactory(); 4 Session ss = sf.getCurrentSession(); 5 Transaction trans = ss.getTransaction(); 6 try { 7 trans.begin(); 8 list = ss.createQuery("from pojo.SinhVienPOJO").list(); 9 trans.commit(); 10 }catch (Exception ex) { 11 System.out.println(ex.getMessage()); 12 } 13 return list; 14 } 68
  69. App 1 List dsSV = dao.SinhVienDAO.layDanhSachSinhVien(); 2 for (int i = 0; i < dsSV.size(); ++i) { 3 SinhVienPOJO sv = dsSV.get(i); 4 cmndPOJO cmnd = sv.getCmnd(); 5 System.out.println("Mã SV: " + sv.getMaSinhVien()); 6 System.out.println("Số CMND: " + cmnd.getCmnd()); 7 System.out.println("Họ tên: " + cmnd.getHoTen()); 8 System.out.println(" "); 9 } 69
  70. SinhVienDAO 1 public static SinhVienPOJO layThongTinSinhVien(String maSinhVien){ 2 SinhVienPOJO sv = null; 3 SessionFactory sf = MyHibernateUtil.getSessionFactory(); 4 Session ss = sf.getCurrentSession(); 5 Transaction trans = ss.getTransaction(); 6 try { 7 trans.begin(); 8 sv = (SinhVienPOJO)ss.get(SinhVienPOJO.class, maSinhVien); 9 trans.commit(); 10 }catch (Exception ex) { 11 System.out.println(ex.getMessage()); 12 } 13 return sv; 14 } 70
  71. SinhVienDAO 1 public static boolean themSinhVien(SinhVienPOJO info) { 2 boolean kq = true; 3 if (SinhVienDAO.layThongTinSinhVien(info.getMaSinhVien()) != null) { 4 return false; 5 } 6 SessionFactory sf = MyHibernateUtil.getSessionFactory(); 7 Session ss = sf.getCurrentSession(); 8 Transaction trans = ss.getTransaction(); 9 try { 10 trans.begin(); 11 ss.save(info); 12 trans.commit(); 13 }catch (Exception ex) { 14 trans.rollback(); 15 System.out.println(ex.getMessage()); 16 kq = false; 17 } 18 return kq; 19 } 71
  72. App 1 SinhVienPOJO sv = new SinhVienPOJO(); 2 sv.setMaSinhVien("0812462"); 3 cmndPOJO cmnd = new cmndPOJO(); 4 cmnd.setCmnd("444444444"); 5 cmnd.setHoTen("Thái Huy Tân"); 6 sv.setCmnd(cmnd); 7 boolean kq = dao.SinhVienDAO.themSinhVien(sv); 8 if (kq) 9 System.out.println("Thêm thành công"); 10 else 11 System.out.println("Thêm thất bại"); 72
  73. XIN CẢM ƠN!