hibernate mapping one-to-many

23
HIBERNATE MAPPING ONE-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 19-Jan-2017

550 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: Hibernate mapping   one-to-many

HIBERNATE MAPPING

ONE-TO-MANY

CHUYÊN ĐỀ JAVA

Nguyễn Hoàng Anh

Email: [email protected]

ĐH KHTN, 2011

Upload by Cafeitvn.com

Page 2: Hibernate mapping   one-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   one-to-many

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

Mối quan hệ một-nhiều (one-to-many)

3

A B 1 *

A

PK IDA

. . .

B

PK IDB

FK1

. . .

IDA

. . .

Upload by Cafeitvn.com

Page 4: Hibernate mapping   one-to-many

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

Mối quan hệ một nhiều (one-to-many)

Trong ứng dụng BookOnline

– Mỗi đầu sách thuộc về một danh mục

– Mỗi danh mục có thể có nhiều đầu sách

Mối quan hệ hướng từ đầu sách đến danh mục được gọi là mối

quan hệ nhiều – một (many-to-one)

Mối quan hệ hướng từ danh mục sang sách được gọi làm mối quan

hệ một-nhiều(one-to-many)

Nếu chỉ có mối quan hệ hướng từ sách đến danh mục hoặc ngược

lại gọi là mối quan hệ một chiều (unidirectional association)

Nếu mối quan hệ hướng cả từ sách đến danh mục và ngược lại gọi

là mối quan hệ hai chiều (bidirectional association)

4

Upload by Cafeitvn.com

Page 5: Hibernate mapping   one-to-many

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

BookOnline

5

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMuc

Upload by Cafeitvn.com

Page 6: Hibernate mapping   one-to-many

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

DanhMuc POJO - SET

6

1

2

3

4

5

6

7

8

9

10

11

12

13

import java.util.HashSet;

import java.util.Set;

public class DanhMuc implements java.io.Serializable {

private String maDanhMuc;

private String tenDanhMuc;

private Set<Sach> sachs = new HashSet<Sach>(0);

//Các phương thức khởi tạo

. . .

//Getter & Setter

. . .

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMuc

Upload by Cafeitvn.com

Page 7: Hibernate mapping   one-to-many

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

DanhMuc.hbm.xml - Set

7

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<hibernate-mapping>

<class name="pojo.DanhMuc" table="danhmuc">

<id name="maDanhMuc" type="string">

<column length="45" name="MaDanhMuc"/>

<generator class="assigned"/>

</id>

<property name="tenDanhMuc" type="string">

<column length="45" name="TenDanhMuc" not-null="true"/>

</property>

<set inverse="true" name="sachs" >

<key>

<column length="45" name="MaDanhMuc" not-null="true"/>

</key>

<one-to-many class="pojo.Sach"/>

</set>

</class>

</hibernate-mapping>

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMuc

Upload by Cafeitvn.com

Page 8: Hibernate mapping   one-to-many

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

Sach POJO

8

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

package pojo;

public class Sach implements java.io.Serializable {

private String maSach;

private DanhMuc danhMuc;

private String tenSach;

private String tacGia;

private double giaBan;

private int soLuong;

private String hinhAnh;

//Constructors

//Getters & Setters

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMuc

Upload by Cafeitvn.com

Page 9: Hibernate mapping   one-to-many

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

Sach.hbm.xml

9

1

2

3

4

5

6

7

8

9

10

11

12

13

<hibernate-mapping>

<class catalog="bookonline" name="pojo.Sach" table="sach">

<id name="maSach" type="string">

<column length="45" name="MaSach"/>

<generator class="assigned"/>

</id>

. . .

<many-to-one class="pojo.DanhMuc" name="danhMuc"

fetch="select">

<column length="45" name="MaDanhMuc" not-null="true"/>

</many-to-one>

</class>

</hibernate-mapping>

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMucUpload by Cafeitvn.com

Page 10: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

10

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

public class DanhMucDAO {

public static DanhMuc layThongTinDanhmuc(String maDanhmuc) {

DanhMuc dm = null;

Session session = HibernateUtil.getSessionFactory()

.openSession();

try {

dm = (DanhMuc)session.get(DanhMuc.class, maDanhmuc);

} catch (HibernateException ex) {

System.err.println(ex);

} finally {

session.close();

}

return dm;

}

}

Upload by Cafeitvn.com

Page 11: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

11

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Main {

public static void main(String[] args) {

DanhMuc dm=DanhMucDAO.layThongTinDanhmuc("DM001");

System.out.println("Mã danh mục: "+dm.getMaDanhMuc());

System.out.println("Tên danh mục: "+dm.getTenDanhMuc());

Iterator<Sach> sachs=dm.getSachs().iterator();

while(sachs.hasNext()){

Sach s=sachs.next();

System.out.println("Mã sách:"+ s.getMaSach());

System.out.println("Tên sách: "+s.getTenSach());

System.out.println("Tác giả: "+s.getTacGia());

System.out.println("Giá bán: "+s.getGiaBan());

System.out.println("Số lượng: "+s.getSoLuong());

System.out.println("Hình ảnh: "+s.getHinhAnh());

}

}

}

Upload by Cafeitvn.com

Page 12: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

12

Lazy = true

Upload by Cafeitvn.com

Page 13: Hibernate mapping   one-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

13

Upload by Cafeitvn.com

Page 14: Hibernate mapping   one-to-many

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

DanhMuc.hbm.xml - Set

14

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<hibernate-mapping>

<class name="pojo.DanhMuc" table="danhmuc">

<id name="maDanhMuc" type="string">

<column length="45" name="MaDanhMuc"/>

<generator class="assigned"/>

</id>

<property name="tenDanhMuc" type="string">

<column length="45" name="TenDanhMuc" not-null="true"/>

</property>

<set inverse="true" name="sachs"

fetch="join" lazy="false" >

<key>

<column length="45" name="MaDanhMuc" not-null="true"/>

</key>

<one-to-many class="pojo.Sach"/>

</set>

</class>

</hibernate-mapping>

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMuc

Upload by Cafeitvn.com

Page 15: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

15

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Main {

public static void main(String[] args) {

DanhMuc dm=DanhMucDAO.layThongTinDanhmuc("DM001");

System.out.println("Mã danh mục: "+dm.getMaDanhMuc());

System.out.println("Tên danh mục: "+dm.getTenDanhMuc());

Iterator<Sach> sachs=dm.getSachs().iterator();

while(sachs.hasNext()){

Sach s=sachs.next();

System.out.println("Mã sách:"+ s.getMaSach());

System.out.println("Tên sách: "+s.getTenSach());

System.out.println("Tác giả: "+s.getTacGia());

System.out.println("Giá bán: "+s.getGiaBan());

System.out.println("Số lượng: "+s.getSoLuong());

System.out.println("Hình ảnh: "+s.getHinhAnh());

}

}

}

Upload by Cafeitvn.com

Page 16: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

16

Lazy = false

Upload by Cafeitvn.com

Page 17: Hibernate mapping   one-to-many

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

DanhMuc.hbm.xml - Set

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

<hibernate-mapping>

<class name="pojo.DanhMuc" table="danhmuc">

<id name="maDanhMuc" type="string">

<column length="45" name="MaDanhMuc"/>

<generator class="assigned"/>

</id>

<property name="tenDanhMuc" type="string">

<column length="45" name="TenDanhMuc" not-null="true"/>

</property>

<set inverse="true" name="sachs" >

<key>

<column length="45" name="MaDanhMuc" not-null="true"/>

</key>

<one-to-many class="pojo.Sach"/>

</set>

</class>

</hibernate-mapping>

1 *

DanhMuc

- maDanhMuc : String- tenDanhMuc :String- sachs : Set

Sach

- maSach :String- tenSach :String- tacGia :String- giaBan :double- soLuong :int- hinhAnh :String- danhMuc :DanhMuc

Upload by Cafeitvn.com

Page 18: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

18

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

public class DanhMucDAO {

public static DanhMuc layThongTinDanhMuc(String maDanhMuc) {

DanhMuc dm = null;

Session session = HibernateUtil.getSessionFactory()

.openSession();

try {

String hql=" select dm ";

hql+= " from DanhMuc dm left join fetch dm.sachs";

hql+= " where dm.maDanhMuc=:maDanhMuc";

Query query=session.createQuery(hql);

query.setString("maDanhMuc", maDanhMuc);

dm=(DanhMuc)query.uniqueResult();

} catch (HibernateException ex) {

System.err.println(ex);

} finally {

session.close();

}

return dm;

}

Upload by Cafeitvn.com

Page 19: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

19

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

public class Main {

public static void main(String[] args) {

DanhMuc dm=DanhMucDAO.layThongTinDanhmuc("DM001");

System.out.println("Mã danh mục: "+dm.getMaDanhMuc());

System.out.println("Tên danh mục: "+dm.getTenDanhMuc());

Iterator<Sach> sachs=dm.getSachs().iterator();

while(sachs.hasNext()){

Sach s=sachs.next();

System.out.println("Mã sách:"+ s.getMaSach());

System.out.println("Tên sách: "+s.getTenSach());

System.out.println("Tác giả: "+s.getTacGia());

System.out.println("Giá bán: "+s.getGiaBan());

System.out.println("Số lượng: "+s.getSoLuong());

System.out.println("Hình ảnh: "+s.getHinhAnh());

}

}

}

Upload by Cafeitvn.com

Page 20: Hibernate mapping   one-to-many

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

DanhMucDAO – lấy thông tin danh mục

20

HQL

Upload by Cafeitvn.com

Page 21: Hibernate mapping   one-to-many

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

Cascade

save-update

delete

delete-orphan

21

Upload by Cafeitvn.com

Page 22: Hibernate mapping   one-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

22

Upload by Cafeitvn.com

Page 23: Hibernate mapping   one-to-many

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

HỎI VÀ ĐÁP

23

Upload by Cafeitvn.com