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 编辑 ] 例子举得很好.赞...楼主成长好快哦...加油... 顺便提个建议,,,实际项目中最好用单向关联,双向关联对效率会有比较大的影响的.我的习惯(还有我们公司也是)一般是做many-to-one,,,如果要获得子文件夹列表的话就再写HQL... good job,powerpoint,
and wool, tells us more detail
[ 本帖最后由 hjack 于 2006-5-14 13:16 编辑 ] 原帖由 hjack 于 2006-5-14 12:50 发表
good job,powerpoint,
and wool, tells up more detail
本来也想详细地写的,但是感觉全部东西只要读代码就基本明白,所以写不出细节来.
当然,也是我理解不深的原因!
唯有加油啦!~ 原帖由 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)... 原帖由 hjack 于 2006-5-14 12:50 发表
good job,powerpoint,
and wool, tells us more detail
不反对用英文,但是你的拼写不是很好,连我的名也拼错了.
wool王说得有理,只是我在学习,不是应用,还是都了解下好.
当然,真正用的话,wool王的意见我会好好记得的. wool甘大反应,看来以后不要在这里用英文了。
不知wool有没有做过相关的性能测试。看看两种方法差异有多大。
如果我有时间的话我想做一下。呵呵。
页:
[1]