powerwind 发表于 2006-5-13 23:29

hibernate映射一对多双向自关联关系

学习Hibernate的映射关系,感觉一对多双向自关联关系包括的知识也比较多。所以在此写个笔记,以作参考。当然,最希望的是得到指教。欢迎讨论!

个人比较喜欢直接写代码,基本上没用到IDE工具。

文件夹之间的关系就是一对多双向自关联关系。

文件夹类:

package powerwind;

import java.io.Serializable;
import java.util.*;

public class Folder implements Serializable {
        private Long id;

        private String name;

        private Folder parentFolder;

        private Set childFolders = new HashSet();

        public Folder() {
        }

        public Folder(String name, Folder parentFolder, Set childFolders) {
                this.name = name;
                this.parentFolder = parentFolder;
                this.childFolders = childFolders;
        }

        public Long getId() {
                return id;
        }

        public void setId(Long id) {
                this.id = id;
        }

        public String getName() {
                return name;
        }

        public void setName(String name) {
                this.name = name;
        }

        public Folder getParentFolder() {
                return parentFolder;
        }

        public void setParentFolder(Folder parentFolder) {
                this.parentFolder = parentFolder;
        }

        public Set getChildFolders() {
                return childFolders;
        }

        public void setChildFolders(Set childFolders) {
                this.childFolders = childFolders;
        }

        public void addChildFolder(Folder folder) {
                if (folder == null)
                        throw new IllegalArgumentException();
                if (folder.getParentFolder() != null)
                        folder.getParentFolder().getChildFolders().remove(folder);
                folder.setParentFolder(this);
                this.getChildFolders().add(folder);
        }

}


对应的配置文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="powerwind">

<class name="powerwind.Folder" table="FOLDERS">
    <id name="id">
      <generator class="increment"/>
    </id>

    <property name="name" type="string">
      <column name="NAME" length="15" />
    </property>

    <many-to-one
                name="parentFolder"
                column="FOLDER_ID"
                class="powerwind.Folder"
                />

    <set
                        name="childFolders"
                        cascade="save-update"
                        inverse="true"
                        >
      <key column="FOLDER_ID" />
      <one-to-many class="powerwind.Folder" />
    </set>
</class>

</hibernate-mapping>


数据厍是使用mysql,

create table FOLDERS(
ID bigint not null,
NAME varchar(15),
FOLDER_ID bigint,
primary key(id)
);
alter table FOLDERS add constraint fk_folders foreign key(FOLDER_ID)references FOLDERS(ID);


hibernate.properties文件内容

hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://localhost:3306/sampledb
hibernate.connection.username=root
hibernate.connection.password=123456
hibernate.show_sql=true


使用ant编译运行
build.xml

<?xml version="1.0"?>
<project name="Learning Hibernate" default="prepare" basedir=".">

<property name="source.root" value="src"/>
<property name="class.root" value="classes"/>
<property name="lib.dir" value="lib"/>

<path id="project.class.path">
      <pathelement location="${class.root}" />
      <fileset dir="${lib.dir}">
      <include name="*.jar"/>
      </fileset>
</path>

<target name="prepare" description="Sets up build structures">
    <delete dir="${class.root}"/>
    <mkdir dir="${class.root}"/>

    <copy todir="${class.root}" >
      <fileset dir="${source.root}" >
      <include name="**/*.properties"/>
      <include name="**/*.hbm.xml"/>
      </fileset>
    </copy>
</target>

<target name="compile" depends="prepare"
          description="Compiles all Java classes">
    <javac srcdir="${source.root}"
         destdir="${class.root}"
         debug="on"
         optimize="off"
         deprecation="on">
      <classpath refid="project.class.path"/>
    </javac>
</target>

<target name="run" description="Run a Hibernate sample"
          depends="compile">
    <java classname="powerwind.BusinessService" fork="true">
      <classpath refid="project.class.path"/>
    </java>
</target>

</project>

注:参考《精通Hibernate》

[ 本帖最后由 powerwind 于 2006-5-14 09:47 编辑 ]

wool王 发表于 2006-5-14 12:36

例子举得很好.赞...楼主成长好快哦...加油...

wool王 发表于 2006-5-14 12:38

顺便提个建议,,,实际项目中最好用单向关联,双向关联对效率会有比较大的影响的.我的习惯(还有我们公司也是)一般是做many-to-one,,,如果要获得子文件夹列表的话就再写HQL...

hjack 发表于 2006-5-14 12:50

good job,powerpoint,

and wool, tells us more detail

[ 本帖最后由 hjack 于 2006-5-14 13:16 编辑 ]

powerwind 发表于 2006-5-14 13:08

原帖由 hjack 于 2006-5-14 12:50 发表
good job,powerpoint,

and wool, tells up more detail

本来也想详细地写的,但是感觉全部东西只要读代码就基本明白,所以写不出细节来.
当然,也是我理解不深的原因!
唯有加油啦!~

wool王 发表于 2006-5-14 14:07

原帖由 hjack 于 2006/5/14 04:50 发表
good job,powerpoint,

and wool, tells us more detail


干嘛用英文...

什么more detail...我说了啊...就是少用one-to-many关联...还有就是many-to-many最好别用,因为多对多关联是效率最低的,如果多数据的话会让响应时间变长,让效率大打折扣(我公司一前辈跟我说的,他说一般海量数据处理不用hibernate的一对多,多对多管理,而是自己另外写HQL)...

powerwind 发表于 2006-5-14 15:01

原帖由 hjack 于 2006-5-14 12:50 发表
good job,powerpoint,

and wool, tells us more detail

不反对用英文,但是你的拼写不是很好,连我的名也拼错了.
wool王说得有理,只是我在学习,不是应用,还是都了解下好.
当然,真正用的话,wool王的意见我会好好记得的.

hjack 发表于 2006-5-14 17:27

wool甘大反应,看来以后不要在这里用英文了。

不知wool有没有做过相关的性能测试。看看两种方法差异有多大。

如果我有时间的话我想做一下。呵呵。
页: [1]
查看完整版本: hibernate映射一对多双向自关联关系