Hibernate實戰(三)

來源:互聯網
上載者:User
Many-to-One關係
 Bromon原創 請尊重著作權
 很明顯一對多或者多對一關聯性是關聯式資料庫中非常常見的現象,下面通過父親-兒子的例子來示範一對多關聯性,多對一關聯性是類似的,不過在我們的這個例子中不宜採用,否則會帶來倫理學上的問題。

 首先定義Child類:
 /*
  * Created on 2004-5-8
  */
 package org.bromon.zizz;

 /**
  * @author Bromon
  */
 public class Child
 {
  private int id;
  private String name;
  private int fatherId;
  private Person father;

  public Child(){}
  
  /**
   * @return
   */
  public Person getFather()
  {
   return father;
  }

  /**
   * @return
   */
  public int getFatherId()
  {
   return fatherId;
  }

  /**
   * @return
   */
  public int getId()
  {
   return id;
  }

  /**
   * @return
   */
  public String getName()
  {
   return name;
  }

  /**
   * @param person
   */
  public void setFather(Person p)
  {
   father = p;
  }

  /**
   * @param i
   */
  public void setFatherId(int i)
  {
   fatherId = i;
  }

  /**
   * @param i
   */
  public void setId(int i)
  {
   id = i;
  }

  /**
   * @param string
   */
  public void setName(String string)
  {
   name = string;
  }

 }

 這裡的fatherId是外鍵,關聯person表的id欄位。

 下面是對應檔Child.hbm.xml:
 <?xml version="1.0"?>
 <!DOCTYPE hibernate-mapping PUBLIC 
        "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
        "' target=_blank>http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">  

 <hibernate-mapping package="org.bromon.zizz">
  <class name="Child" table="child" lazy="true">
   <id name="id" type="integer" unsaved-value="null">
    <column name="id" sql-type="int" not-null="true"/>
    <generator class="identity"/>
   </id>
        
   <property name="name" column="name" not-null="true" unique="false"/>
   <many-to-one name="father" column="fatherid" />
       
  </class> 
 </hibernate-mapping>
 需要注意的是fatherId並沒有做為一個property被映射,而是在many-to-one聲明中使用。

 需要對Person..java做修改,添加以下代碼:

 import java.util.*;

 private Set children=new HashSet();
 /**
 * @return
 */
 public Set getChildren()
 {
  return children;
 }
 /**
 * @param set
 */
 public void setChildren(Set set)
 {
  children = set;
 }

 然後修改Person.hbm.xml,對添加的代碼做映射:

 <set name="books" lazy="true" inverse="true" cascade="all" > 
  <key column="fatherid"/> 
  <one-to-many class="Child" /> 
 </set>

 這裡的key column是child表的外鍵,inverse需要指定為true。

 下面做操作一下,功能是查詢person表中id=1的記錄,作為小孩的父親,然後給child表添加一條新記錄。

 /*
  * Created on 2004-5-8
  */
 package org.bromon.zizz;
 import net.sf.hibernate.*;
 import net.sf.hibernate.cfg.*;
 import net.sf.hibernate.tool.hbm2ddl.*;
 /**
  * @author Bromon
  */
 public class OperateChild
 {
  /**
   * @param args
   */
  public static void main(String args[])
  {
   try
   {
    Configuration cfg = new Configuration().addClass(Person.class);
    cfg.addClass(Child.class);
    SessionFactory sessions = cfg.buildSessionFactory();
    new SchemaExport(cfg).create(true, true);
    Session session = sessions.openSession();
    
    Child c=new Child();
    
    /*Query q=session.createQuery("from org.bromon.zizz.Person as p where p.id=1");
    Person p=(Person)q.list().get(0);*/
    
    Person p=(Person)session.find("from org.bromon.zizz.Person as p where p.id=?",new Integer(1),Hibernate.INTEGER).get(0);
    System.out.println(p.getName());
    c.setName("andy");
    c.setFather(p);
    
    Transaction ts = session.beginTransaction();
    session.save(c);
    ts.commit();
    session.close();
   } catch (Exception e)
   {
    System.out.println(e);
   }
  }
 }

 被注釋掉的部分是HQL的另外一種查詢方法。在這個例子中可以看出對象的查詢非常容易,不需要自己再去封裝資料,修改和刪除對象也很容易:

 //得到一個對象
 Query q=session.createQuery("from org.bromon.zizz.Person as p where p.id=1");
 Person p=(Person)q.list().get(0);

 //修改資料
 p.setName(“Mr Smith”);

 //儲存資料
 session.save(p);
 session.flush();

 //刪除資料
 session.delete(p);
 session.flush();

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.