hibernate mapping many-to-many

27
HIBERNATE MAPPING MANY-TO-MANY CHUYÊN ĐỀ JAVA Nguyễn Hoàng Anh Email: [email protected] ĐH KHTN, 2011 Upload by Cafeitvn.com

Upload: cong-thanh-nguyen

Post on 07-Jan-2017

874 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Hibernate mapping   Many-to-many

HIBERNATE MAPPING

MANY-TO-MANY

CHUYÊN ĐỀ JAVA

Nguyễn Hoàng Anh

Email: [email protected]

ĐH KHTN, 2011

Upload by Cafeitvn.com

Page 2: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

Nội dung trình bày

One to many

Lazy Initialization

Fetch

Cascade

2

Upload by Cafeitvn.com

Page 3: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 4: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 5: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 6: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 7: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 8: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 9: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 10: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 11: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 12: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 13: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

SinhVienDAO – lấy thông tin sinh viên

13

Lazy = true

Upload by Cafeitvn.com

Page 14: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 15: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 16: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 17: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

SinhVienDAO – lấy thông tin sinh viên

17

Lazy = false

Upload by Cafeitvn.com

Page 18: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 19: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 20: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 21: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

SinhVienDAO – lấy thông tin sinh viên

21

HQL

Upload by Cafeitvn.com

Page 22: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 23: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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("[email protected]");

KhoaHoc kh=new KhoaHoc();

kh.setMaKhoaHoc("KHNET");

kh.setTenKhoaHoc(".NET");

sv.getKhoahocs().add(kh);

SinhVienDAO.themSinhVien(sv);

}

}

Upload by Cafeitvn.com

Page 24: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

SinhVienDAO – thêm sinh viên

24

Upload by Cafeitvn.com

Page 25: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

Cascade

save-update

delete

25

Upload by Cafeitvn.com

Page 26: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – Đ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

Page 27: Hibernate mapping   Many-to-many

Nguyễn Hoàng Anh – [email protected] – ĐH KHTN - 2011

HỎI VÀ ĐÁP

27

Upload by Cafeitvn.com