一對多關係映射

  兩張表之間若是存在外鍵,就會出現一對多關係(外鍵不能同時是主鍵)
  若是想使用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

相關文章
相關標籤/搜索