1、 OneToMany模式
这次用到的例子是Father和child之间的关系。一个father可以有n个child,但是1个child只有一个father。这里只说生父。至于其他的继父、养父、干爹等等,不再范围之内。
2、 sql脚本:
use HibernateQuickUse;
drop table if exists Child;
drop table if exists Father;
create table Father (
id varchar(32) primary key,
name varchar(32) not null
);
create table Child (
id varchar(32) primary key,
name varchar(128) not null,
father_id varchar(32) not null,
foreign key(father_id) references Father(id)
);
根据Hibernate模型创建java对象
3、 Father.java:
package org.py.hib.relation.one2many;
import java.util.HashSet;
import java.util.Set;
public class Father implements java.io.Serializable {
private static final long serialVersionUID = -1846142428723307146L;
private String id;
private String name;
private Set<Child> children = new HashSet<Child>(0);
public Father() {
}
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Set<Child> getChildren() {
return children;
}
public void setChildren(Set<Child> children) {
this.children = children;
}
}
4、 Child.java:
package org.py.hib.relation.one2many;
public class Child implements java.io.Serializable {
private static final long serialVersionUID = 7280413463573380244L;
private String id;
private String name;
private Father father;
public Child() {
}
public String getId() {
return this.id;
}
public void setId(String id) {
this.id = id;
}
public Father getFather() {
return this.father;
}
public void setFather(Father father) {
this.father = father;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
}
Hibernate映射文件如下:
5、 数据库文件hibernate.cfg.xml
同上一实例
6、 Father.hbm.xml:
<?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.py.hib.relation.one2many.Father" table="father">
<id name="id" type="java.lang.String" column="id" length="32">
<generator class="uuid" />
</id>
<property name="name" type="java.lang.String" column="name" length="32" not-null="true"/>
<set name="children" table="child" cascade="all" inverse="true">
<key column="father_id" />
<one-to-many class="org.py.hib.relation.one2many.Child" />
</set>
</class>
</hibernate-mapping>
这里要说说 "set" 这个标签里面的内容。
"name"是Father里面的属性的名字。
"table"表示它对应的是数据库中的哪个表。
cascade="all" 表示所有的操作都级联操作。
"inverse"表示关系的维护由谁来执行。true表示不由自己执行,而有对应的另外一方执行。false则相反,表示由自己维护关系。这里设置成 true 是由原因的。如果说把它设置成为false,那么就由他来维护关系了。
这里得说一下inverse属性的问题。在one-to-many中,如果关系由one来维护,那么会很麻烦,性能也会很低。每次对many一方的一条记录进行增、删、改 时都会多一次update操作。原因很简单,因为关系的维护设置在了one这一方,所以对many的每一次操作,one这一方都要维护一次双方的关系。
"key" 中的 "column" 表示在table(这里的table是child)中, 跟Father关联的字段名称。这里是"father_id"。可以看看开始的sql脚本。
hibernate中的one-to-many 表示father和children的关系。class则表示是同哪个类是这种关系。
7、 Child.hbm.xml:
<?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.py.hib.relation.one2many.Child" table="child">
<id name="id" type="java.lang.String" column="id" length="32" >
<generator class="uuid" />
</id>
<property name="name" type="java.lang.String" column="name" length="128" not-null="true"/>
<many-to-one name="father" class="org.py.hib.relation.one2many.Father" column="father_id" />
</class>
</hibernate-mapping>
这个里面主要就是多了一个many-to-one,表示child 和 father 的关系是"many-to-one"