兩張表之間若是存在外鍵,就會出現一對多關係(外鍵不能同時是主鍵)
若是想使用pojo類來表示一對多關係,這裏以省份和城市爲例:
省份類中應該包含多個城市的對象,通常默認使用Set集合表示某個省份下多個城市
城市類中應該包含一個省份的對象。
若是在表中存在外鍵,且使用MyEclipse一塊兒選擇兩張表生成映射,則會自動生成出一對多關係。
先創建省份和城市表。
CREATE TABLE province (
id number(8) primary key ,
title varchar2(50) not null
);
INSERT INTO province VALUES (1,'江蘇');
INSERT INTO province VALUES (2,'廣東');
INSERT INTO province VALUES (3,'河南');
CREATE TABLE city (
id number(8) primary key ,
title varchar2(50) not null,
province_id number(8) ,
foreign key (province_id) references province (id) on delete cascade
);
INSERT INTO city VALUES (1,'南通¨',1);
INSERT INTO city VALUES (2,'南京',1);
INSERT INTO city VALUES (3,'蘇州',1);
INSERT INTO city VALUES (4,'廣州',2);
INSERT INTO city VALUES (5,'深圳',2);
INSERT INTO city VALUES (6,'洛陽',3);
INSERT INTO city VALUES (7,'南陽',3);
COMMIT;
生成映射:
public class Province implements java.io.Serializable {
private Integer id;
private String title;
private Set cities = new HashSet(0);
public class City implements java.io.Serializable {
private Integer id;
private Province province;
private String title;
經過映射文件描述了這種一對多關係。
<?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="org.liky.primary.pojo.Province" table="PROVINCE" schema="SUNXUN">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="8" scale="0" />
<generator class="increment" />
</id>
<property name="title" type="java.lang.String">
<column name="TITLE" length="50" not-null="true" />
</property>
<!--
在Province中存在一個名稱爲cities的Set集合
-->
<set name="cities" inverse="true">
<!--
關聯外鍵是PROVINCE_ID
-->
<key>
<column name="PROVINCE_ID" precision="8" scale="0" />
</key>
<!--
表示當前類(Province)與City類存在一對多關係
-->
<one-to-many class="org.liky.primary.pojo.City" />
</set>
</class>
</hibernate-mapping>
<?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="org.liky.primary.pojo.City" table="CITY" schema="SUNXUN">
<id name="id" type="java.lang.Integer">
<column name="ID" precision="8" scale="0" />
<generator class="increment" />
</id>
<!--
當前類(city)與Province存在多對一關係,關聯的對象是province,表中關聯的字段是province_id
-->
<many-to-one name="province" class="org.liky.primary.pojo.Province" fetch="select">
<column name="PROVINCE_ID" precision="8" scale="0" />
</many-to-one>
<property name="title" type="java.lang.String">
<column name="TITLE" length="50" not-null="true" />
</property>
</class>
</hibernate-mapping>
Inverse="true"表示:關聯關係反轉,也就是關聯關係由對方進行維護。
關聯關係在這裏指的是外鍵字段province_id,該字段是city表的,也就是說修改city表,才能夠修改這個字段,也就能夠說city表維護着關聯關係。對於Province來講,對方就是city,也就是說關聯關係由對方(city)來維護雅思答案 www.jamo123.com
public static void main(String[] args) {
City c = (City) HibernateSessionFactory.getSession()。get(City.class, 5);
System.out.println(c.getTitle());
System.out.println(c.getProvince()。getTitle());
}
經過這段測試,能夠看出fetch的做用
使用get或load方法按主鍵查詢時,若是fetch="select",是懶漢式加載,先查詢出城市信息,當用到省份信息時,再查詢省份。
Fetch="join",則是一次關聯查詢將省份和城市一塊兒取得託福答案 www.yztrans.com
使用了一對多關係後,Hibernate能夠自動根據關聯關係,將關聯數據取得。
例如:
查詢省份,能夠自動將全部城市也列表顯示出來。
String hql = "FROM Province";
List<Province> allP = HibernateSessionFactory.getSession()。createQuery(
hql)。list();
Iterator<Province> iter = allP.iterator();
while (iter.hasNext()) {
Province p = iter.next();
System.out.println(p.getTitle());
Iterator<City> iter2 = p.getCities()。iterator();
while(iter2.hasNext()) {
City c = iter2.next();
System.out.println(" |- " + c.getTitle());
}
}java