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, …)