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 4 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

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]

(1)(2)

Nôi dung học

Many - to - One

One to One

(3)

Mapping Many To One

Một

học sinh

thuộc

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

(4)

Many to one: LopPOJO

1

2

3

4

5

6

package

pojo;

public

class

LopPojo

implements

java.io.Serializable {

private

String

maLop

;

private

String

tenLop

;

}

(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>

(6)

Many to one: HocSinhPOJO

1

2

3

4

5

6

package

pojo;

public

class

HocSinhPojo

implements

java.io.Serializable {

private

int

maHocSinh

;

private

String

tenHocSinh

;

private

LopPojo

lop

;

(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

class

=

"pojo.LopPojo"

>

Tên lớp cần mapping tới

<column

name

=

"MaLop"

/>

Tên cột table HocSinh

(8)

Lấy thông tin học sinh

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

(9)

Lấy thông tin học sinh

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 đóng Session

(10)

Lấy thơng tin học sinh

Lỗi

Lấy thông tin học sinh sau đóng Session

(11)

Lấy thông tin học sinh

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()); }

}

(12)

Lấy thông tin học sinh

Nguyên nhân lỗi:

Cơ chế

Lazy Initialization

bật (= true)

Truy vấn đối tượng

HocSinh

không kèm theo truy

vấn đối tượng

Lop

(chỉ truy vấn mã lớp

mà không truy vấn tên lớp)

Truy vấn đối tượng cha không kèm theo truy vấn

(13)

Lazy Initialization & fetch

Trong Hibernate, Lazy Initialization giúp

Tránh câu truy vấn sở liệu

khơng cần

thiết

Gia

tăng hiệu suất

thực thi

(14)

Cách

Sau có mã lớp, ta dùng làm lấy thông tin lớp theo

mã lớp

(15)

Cách

– Khai báo

lazy = false

Hocsinh.hbm.xml

1 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>

(16)

Cơ chế fetch

Lazy =“

false

” truy vấn lớp cha

kèm theo

truy vấn lớp

Fetch = “

select

” sử dụng select để truy vấn lớp 

sử dụng câu truy vấn select để truy vấn lớp cha

con, cách khơng hiệu phải truy xuất tới sở

dữ liệu lần

Fetch = “

join

” sử dụng phép kết để gọp truy vấn lớp cha

(17)

Cơ chế fetch – sử dụng

select

1 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

Chú ý

: sữa lại file cấu hình xml (cấu hình hibernate, cấu hình mapping, …

(18)

Cơ chế fetch – sử dụng

select

1 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

Chú ý:

mỗi sữa lại file cấu hình xml (cấu hình hibernate, cấu hình

mapping, …)

(19)

Cơ chế fetch – sử dụng

select

Bản chất, câu truy vấn HQL chuyển SQL, hình

có câu select

được gọi 

truy

xuất CSDL lần

2 câu truy vấn

select

(20)

Cơ chế fetch – sử dụng

join

1 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

Chú ý:

mỗi sữa lại file cấu hình xml (cấu hình hibernate, cấu hình

mapping, …)

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

TỪ KHÓA LIÊN QUAN