CSDN博客

img bromon

Hibernate实战(三)

发表于2004/6/22 18:49:00  2381人阅读

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();

0 0

相关博文

我的热门文章

img
取 消
img