1. Trang chủ
  2. » Trung học cơ sở - phổ thông

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

20 5 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 403 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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.. Cơ chế fetch – sử dụng select[r]

Trang 1

Bài 7: Hibernate Mapping

Trang 2

Nôi dung bài học

 Many - to - One

 One to One

 One to Many

 Many to Many

Trang 3

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

Học sinh

- MaHocSinh: Int

- TenHocSinh: Str

- MaLop: Str

Lớp

- MaLop: String

- TenLop: String 1 *

Trang 4

Many to one: LopPOJO

1

2

3

4

5

6

}

//Các phương thức set, get, constructor

Trang 5

Many to one: Lop.hbm.xml

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>

<class name = "pojo.LopPojo" table = "lop" >

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

<column name = "MaLop" length = "10" />

<generator class = "assigned" />

</id>

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

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

</property>

</class>

</hibernate-mapping>

Trang 6

Many to one: HocSinhPOJO

1

2

3

4

5

6

//Các phương thức get, set, constructor

}

Trang 7

Many to one: HocSinh.hbm.xml

1

2

3

4

5

6

7

8

9

10

11

12

<hibernate-mapping>

<class name = "pojo.HocSinhPojo" table = "hocsinh" >

<id name = "maHocSinh" column = "MaHocSinh" type = "integer" >

<generator class = "assigned" />

</id>

<property name = "tenHocSinh" column = "TenHocSinh"

type = "string" />

<many-to-one name = "lop" class = "pojo.LopPojo" >

<column name = "MaLop" />

</many-to-one>

</class>

</hibernate-mapping>

<many-to-one

name = "lop”  tên thuộc tính cần mapping

</many-to-one>

Trang 8

Lấy thông tin học sinh

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

Trang 9

Lấy thông tin học sinh

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

Trang 10

Lấy thông tin học sinh

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

Trang 11

Lấy thông tin học sinh

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

Trang 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

Trang 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

• Lazy mặc định có giá trị là true

Trang 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);

Trang 15

Cách 2 – Khai báo lazy = false trong Hocsinh.hbm.xml

1

2

3

4

5

6

7

8

9

10

11

<hibernate-mapping>

<classname="pojo.HocSinhPojo"table="hocsinh">

<idname="maHocSinh"column="MaHocSinh"type="integer">

<generatorclass="assigned"/>

</id>

<propertyname="tenHocSinh"column="TenHocSinh" type="string"/>

<many-to-onename="lop"class="pojo.LopPojo"lazy="false" >

<columnname="MaLop"/>

</many-to-one>

</class>

</hibernate-mapping>

Trang 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

Trang 17

Cơ chế fetch – sử dụng select

1

2

3

4

5

6

7

8

9

10

11

<hibernate-mapping>

<classname="pojo.HocSinhPojo"table="hocsinh">

<idname="maHocSinh"column="MaHocSinh"type="integer">

<generatorclass="assigned"/>

</id>

<propertyname="tenHocSinh"column="TenHocSinh" type="string"/>

<many-to-onename="lop"class="pojo.LopPojo"lazy="false" fetch="select">

<columnname="MaLop"/>

</many-to-one>

</class>

</hibernate-mapping>

Hocsinh.hbm.xml

Phải clean and built lại project thì thay đổi mới có hiệu lực

Trang 18

Cơ chế fetch – sử dụng select

1

2

3

4

5

6

7

8

9

10

11

<hibernate-mapping>

<classname="pojo.HocSinhPojo"table="hocsinh">

<idname="maHocSinh"column="MaHocSinh"type="integer">

<generatorclass="assigned"/>

</id>

<propertyname="tenHocSinh"column="TenHocSinh" type="string"/>

<many-to-onename="lop"class="pojo.LopPojo"lazy="false" fetch="select">

<columnname="MaLop"/>

</many-to-one>

</class>

</hibernate-mapping>

Hocsinh.hbm.xml

mapping, …)

Phải clean and built lại project thì thay đổi mới có hiệu lực

Trang 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

Trang 20

Cơ chế fetch – sử dụng join

1

2

3

4

5

6

7

8

9

10

11

<hibernate-mapping>

<classname="pojo.HocSinhPojo"table="hocsinh">

<idname="maHocSinh"column="MaHocSinh"type="integer">

<generatorclass="assigned"/>

</id>

<propertyname="tenHocSinh"column="TenHocSinh" type="string"/>

<many-to-onename="lop"class="pojo.LopPojo"lazy="false" fetch=“join">

<columnname="MaLop"/>

</many-to-one>

</class>

</hibernate-mapping>

Hocsinh.hbm.xml

mapping, …)

Phải clean and built lại project thì thay đổi mới có hiệu lực

Ngày đăng: 11/03/2021, 10:49

TỪ KHÓA LIÊN QUAN