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"

没有登录不能评论