Post on 07-Jan-2017
HIBERNATE MAPPING
MANY-TO-MANY
CHUYÊN ĐỀ JAVA
Nguyễn Hoàng Anh
Email: nhanh@fit.hcmus.edu.vn
ĐH KHTN, 2011
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Nội dung trình bày
One to many
Lazy Initialization
Fetch
Cascade
2
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Mối quan hệ nhiều-nhiều (many-to-many)
3
A B * *
A
PK IDA
. . .
. . .
B
PK IDB
. . .
. . .
AB
PK IDA (FK)
PK IDB (FK)
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Mối quan hệ nhiều-nhiều (many-to-many)
Trong ứng dụng đăng ký học phần
– Mỗi sinh viên có thể đăng ký nhiều khóa học
– Mỗi khóa học có thể có nhiều sinh viên đăng ký học
Mối quan hệ hướng từ sinh viên đến khóa học và ngược
lại gọi là mối quan hệ nhiều – nhiều(many-to-many)
4
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Many to many
5
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Many to many
6
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVien POJO
7
1
2
3
4
5
6
7
8
9
10
11
12
13
public class SinhVien implements java.io.Serializable {
private String maSinhVien;
private String tenSinhVien;
private String email;
private String diaChi;
private Set<KhoaHoc> khoahocs = new HashSet<KhoaHoc>(0);
// Các phương thức khởi tạo
. . .
// Các phương thức get/set
. . .
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVien.hbm.xml
8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
<class catalog="quanlydangkyhocphan" name="pojo.SinhVien"
table="sinhvien">
. . .
<set inverse="false" name="khoahocs"
table="khoahoc_sinhvien">
<key>
<column length="10" name="MaSinhVien" not-null="true"/>
</key>
<many-to-many entity-name="pojo.KhoaHoc">
<column length="10“
name="MaKhoaHoc" not-null="true"/>
</many-to-many>
</set>
</class>
</hibernate-mapping>
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
KhoaHoc POJO
9
1
2
3
4
5
6
7
8
9
10
11
12
public class KhoaHoc implements java.io.Serializable {
private String maKhoaHoc;
private String tenKhoaHoc;
private Set<SinhVien> sinhviens =
new HashSet<SinhVien>(0);
// Các phương thức khởi tạo
. . .
// Các phương thức get/set
. . .
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVien.hbm.xml
10
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<hibernate-mapping>
<class catalog="quanlydangkyhocphan"
name="pojo.KhoaHoc" table="khoahoc">
. . .
<set inverse="true" name="sinhviens"
table="khoahoc_sinhvien">
<key>
<column length="10" name="MaKhoaHoc"
not-null="true"/>
</key>
<many-to-many entity-name="pojo.SinhVien">
<column length="10"
name="MaSinhVien" not-null="true"/>
</many-to-many>
</set>
</class>
</hibernate-mapping>
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
11
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SinhVienDAO {
public static SinhVien layThongTinSinhVien(String maSinhVien)
{
SinhVien sv = null;
Session session = HibernateUtil.getSessionFactory()
.openSession();
try {
sv =(SinhVien) session.get(SinhVien.class, maSinhVien);
} catch (HibernateException ex) {
System.err.println(ex);
} finally {
session.close();
}
return sv;
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
12
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
SinhVien sv=SinhVienDAO.layThongTinSinhVien("0312143");
System.out.println(sv.getMaSinhVien());
System.out.println(sv.getTenSinhVien());
System.out.println(sv.getEmail());
System.out.println(sv.getDiaChi());
Iterator<KhoaHoc> khoaHocs=sv.getKhoahocs().iterator();
while(khoaHocs.hasNext()){
KhoaHoc kh=khoaHocs.next();
System.out.println(kh.getMaKhoaHoc());
System.out.println(kh.getTenKhoaHoc());
}
}
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
13
Lazy = true
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Lazy Initialization
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
14
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVien.hbm.xml
15
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
<class catalog="quanlydangkyhocphan" name="pojo.SinhVien"
table="sinhvien">
. . .
<set inverse="false" name="khoahocs" fetch="join"
lazy="false“ table="khoahoc_sinhvien">
<key>
<column length="10" name="MaSinhVien" not-null="true"/>
</key>
<many-to-many entity-name="pojo.KhoaHoc">
<column length="10“
name="MaKhoaHoc" not-null="true"/>
</many-to-many>
</set>
</class>
</hibernate-mapping>
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
SinhVien sv=SinhVienDAO.layThongTinSinhVien("0312143");
System.out.println(sv.getMaSinhVien());
System.out.println(sv.getTenSinhVien());
System.out.println(sv.getEmail());
System.out.println(sv.getDiaChi());
Iterator<KhoaHoc> khoaHocs=sv.getKhoahocs().iterator();
while(khoaHocs.hasNext()){
KhoaHoc kh=khoaHocs.next();
System.out.println(kh.getMaKhoaHoc());
System.out.println(kh.getTenKhoaHoc());
}
}
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
17
Lazy = false
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVien.hbm.xml
18
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<hibernate-mapping>
<class catalog="quanlydangkyhocphan" name="pojo.SinhVien"
table="sinhvien">
. . .
<set inverse="false" name="khoahocs"
table="khoahoc_sinhvien">
<key>
<column length="10" name="MaSinhVien" not-null="true"/>
</key>
<many-to-many entity-name="pojo.KhoaHoc">
<column length="10“
name="MaKhoaHoc" not-null="true"/>
</many-to-many>
</set>
</class>
</hibernate-mapping>
1 *
SinhVien
- maSinhVien :String- tenSinhVien :String- email :String- diaChi :String- khoaHocs : Set<KhoaHoc>
KhoaHoc
- maKhoaHoc :String- tenKhoaHoc :String- sinhViens :Set<SinhVien>
1*
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class SinhVienDAO { public static SinhVien layThongTinSinhVien(String maSinhVien)
{ SinhVien sv = null;
Session session = HibernateUtil.getSessionFactory()
.openSession();
try {
String hql= " select sv ";
hql +="from SinhVien sv left join fetch sv.khoahocs";
hql += " where sv.maSinhVien=:maSinhVien";
Query query = session.createQuery(hql);
query.setString("maSinhVien", maSinhVien);
sv = (SinhVien) query.uniqueResult();
} catch (HibernateException ex) {
System.err.println(ex);
} finally {
session.close();
}
return sv;
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
SinhVien sv=SinhVienDAO.layThongTinSinhVien("0312143");
System.out.println(sv.getMaSinhVien());
System.out.println(sv.getTenSinhVien());
System.out.println(sv.getEmail());
System.out.println(sv.getDiaChi());
Iterator<KhoaHoc> khoaHocs=sv.getKhoahocs().iterator();
while(khoaHocs.hasNext()){
KhoaHoc kh=khoaHocs.next();
System.out.println(kh.getMaKhoaHoc());
System.out.println(kh.getTenKhoaHoc());
}
}
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – lấy thông tin sinh viên
21
HQL
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – thêm sinh viên
22
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class SinhVienDAO { public static boolean themSinhVien(SinhVien sv) {
Session session = HibernateUtil.getSessionFactory().openSession();
if (SinhVienDAO.layThongTinSinhVien(sv.getMaSinhVien()) != null) {
return false;
}
boolean kq = true;
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.saveOrUpdate(sv);
transaction.commit();
} catch (HibernateException ex) {
transaction.rollback();
System.err.println(ex);
kq = false;
} finally {
session.close();
}
return kq;
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – thêm sinh viên
23
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {
public static void main(String[] args) {
SinhVien sv=new SinhVien();
sv.setMaSinhVien("0312078");
sv.setTenSinhVien("Hoàng Minh Châu");
sv.setDiaChi("231 Phan Đăng Lưu Bình Thạnh");
sv.setEmail("hoangminh@gmail.com");
KhoaHoc kh=new KhoaHoc();
kh.setMaKhoaHoc("KHNET");
kh.setTenKhoaHoc(".NET");
sv.getKhoahocs().add(kh);
SinhVienDAO.themSinhVien(sv);
}
}
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
SinhVienDAO – thêm sinh viên
24
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Cascade
save-update
delete
25
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
Tài liệu tham khảo
Nguyễn Hoàng Anh, Tập bài giảng và video môn
chuyên đề Java, 2010
Gary Mak, Tập hướng dẫn từng bước Hibernate,
2006
26
Upload by Cafeitvn.com
Nguyễn Hoàng Anh – nhanh@fit.hcmus.edu.vn – ĐH KHTN - 2011
HỎI VÀ ĐÁP
27
Upload by Cafeitvn.com