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