工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3149|回复: 7

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

[复制链接]
发表于 2006-5-13 23:29 | 显示全部楼层 |阅读模式
学习Hibernate的映射关系,感觉一对多双向自关联关系包括的知识也比较多。所以在此写个笔记,以作参考。当然,最希望的是得到指教。欢迎讨论!

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

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

文件夹类:

  1. package powerwind;

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

  4. public class Folder implements Serializable {
  5.         private Long id;

  6.         private String name;

  7.         private Folder parentFolder;

  8.         private Set childFolders = new HashSet();

  9.         public Folder() {
  10.         }

  11.         public Folder(String name, Folder parentFolder, Set childFolders) {
  12.                 this.name = name;
  13.                 this.parentFolder = parentFolder;
  14.                 this.childFolders = childFolders;
  15.         }

  16.         public Long getId() {
  17.                 return id;
  18.         }

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

  22.         public String getName() {
  23.                 return name;
  24.         }

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

  28.         public Folder getParentFolder() {
  29.                 return parentFolder;
  30.         }

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

  34.         public Set getChildFolders() {
  35.                 return childFolders;
  36.         }

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

  40.         public void addChildFolder(Folder folder) {
  41.                 if (folder == null)
  42.                         throw new IllegalArgumentException();
  43.                 if (folder.getParentFolder() != null)
  44.                         folder.getParentFolder().getChildFolders().remove(folder);
  45.                 folder.setParentFolder(this);
  46.                 this.getChildFolders().add(folder);
  47.         }

  48. }
复制代码


对应的配置文件

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

  5.   <class name="powerwind.Folder" table="FOLDERS">
  6.     <id name="id">
  7.       <generator class="increment"/>
  8.     </id>

  9.     <property name="name" type="string">
  10.       <column name="NAME" length="15" />
  11.     </property>

  12.     <many-to-one
  13.                 name="parentFolder"
  14.                 column="FOLDER_ID"
  15.                 class="powerwind.Folder"
  16.                 />

  17.     <set
  18.                         name="childFolders"
  19.                         cascade="save-update"
  20.                         inverse="true"
  21.                         >
  22.       <key column="FOLDER_ID" />
  23.       <one-to-many class="powerwind.Folder" />
  24.     </set>
  25.   </class>

  26. </hibernate-mapping>
复制代码


数据厍是使用mysql,

  1. create table FOLDERS(
  2. ID bigint not null,
  3. NAME varchar(15),
  4. FOLDER_ID bigint,
  5. primary key(id)
  6. );
  7. alter table FOLDERS add constraint fk_folders foreign key(FOLDER_ID)references FOLDERS(ID);
复制代码


hibernate.properties文件内容

  1. hibernate.dialect=net.sf.hibernate.dialect.MySQLDialect
  2. hibernate.connection.driver_class=com.mysql.jdbc.Driver
  3. hibernate.connection.url=jdbc:mysql://localhost:3306/sampledb
  4. hibernate.connection.username=root
  5. hibernate.connection.password=123456
  6. hibernate.show_sql=true
复制代码


使用ant编译运行
build.xml

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

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

  6.   <path id="project.class.path">
  7.       <pathelement location="${class.root}" />
  8.       <fileset dir="${lib.dir}">
  9.         <include name="*.jar"/>
  10.       </fileset>
  11.   </path>

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

  15.     <copy todir="${class.root}" >
  16.       <fileset dir="${source.root}" >
  17.         <include name="**/*.properties"/>
  18.         <include name="**/*.hbm.xml"/>
  19.       </fileset>
  20.     </copy>
  21.   </target>

  22.   <target name="compile" depends="prepare"
  23.           description="Compiles all Java classes">
  24.     <javac srcdir="${source.root}"
  25.            destdir="${class.root}"
  26.            debug="on"
  27.            optimize="off"
  28.            deprecation="on">
  29.       <classpath refid="project.class.path"/>
  30.     </javac>
  31.   </target>

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

  38. </project>
复制代码

注:参考《精通Hibernate》

[ 本帖最后由 powerwind 于 2006-5-14 09:47 编辑 ]
发表于 2006-5-14 12:36 | 显示全部楼层
例子举得很好.赞...楼主成长好快哦...加油...
回复

使用道具 举报

发表于 2006-5-14 12:38 | 显示全部楼层
顺便提个建议,,,实际项目中最好用单向关联,双向关联对效率会有比较大的影响的.我的习惯(还有我们公司也是)一般是做many-to-one,,,如果要获得子文件夹列表的话就再写HQL...
回复

使用道具 举报

发表于 2006-5-14 12:50 | 显示全部楼层
good job,powerpoint,

and wool, tells us more detail

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

使用道具 举报

 楼主| 发表于 2006-5-14 13:08 | 显示全部楼层
原帖由 hjack 于 2006-5-14 12:50 发表
good job,powerpoint,

and wool, tells up more detail


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

使用道具 举报

发表于 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)...
回复

使用道具 举报

 楼主| 发表于 2006-5-14 15:01 | 显示全部楼层
原帖由 hjack 于 2006-5-14 12:50 发表
good job,powerpoint,

and wool, tells us more detail


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

使用道具 举报

发表于 2006-5-14 17:27 | 显示全部楼层
wool甘大反应,看来以后不要在这里用英文了。

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

如果我有时间的话我想做一下。呵呵。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2024-5-31 01:02

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

快速回复 返回顶部 返回列表