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