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 20public 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 20public 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 20public 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>