我需要一些帮助来理解如何做到这一点;我将在一个文件系统上运行递归的'find‘,并且我希望将信息保存在一个具有自引用层次结构的单个DB表中:
这是我要填充的DB表结构。
DirObject表:
id int NOT NULL,
name varchar(255) NOT NULL,
parentid int NOT NULL);下面是我要映射的建议的Java类(仅显示字段):
public DirObject {
int id;
String name;
DirObject parent;
...因为“根”目录将使用parentid=0;真实的I将从1开始,理想情况下我希望hibernate自动生成I。
有人能为此提供一个建议的映射文件吗;作为第二个问题,我想做这样的Java类:
public DirObject {
int id;
String name;
List<DirObject> subdirs;我可以对这两种方法中的任何一种使用相同的数据模型吗?(当然,使用不同的映射文件)。
- UPDATE:所以我尝试了下面建议的映射文件(谢谢!),这里重复一下以供参考:
<hibernate-mapping>
<class name="my.proj.DirObject" table="category">
...
<set name="subDirs" lazy="true" inverse="true">
<key column="parentId"/>
<one-to-many class="my.proj.DirObject"/>
</set>
<many-to-one name="parent"
class="my.proj.DirObject"
column="parentId" cascade="all" />
</class>...and修改了我的Java类,让“parentid”和“getSubDirs”都返回一个“HashSet”。
这似乎是有效的-谢谢,但这是我用来驱动它的测试代码-我认为我在这里没有做正确的事情,因为我认为Hibernate会负责保存Set中的从属对象,而不需要我显式地这样做?
DirObject dirobject=new DirObject();
dirobject.setName("/files");
dirobject.setParent(dirobject);
DirObject d1, d2;
d1=new DirObject(); d1.setName("subdir1"); d1.setParent(dirobject);
d2=new DirObject(); d2.setName("subdir2"); d2.setParent(dirobject);
HashSet<DirObject> subdirs=new HashSet<DirObject>();
subdirs.add(d1);
subdirs.add(d2);
dirobject.setSubdirs(subdirs);
session.save(dirobject);
session.save(d1);
session.save(d2);发布于 2009-12-08 04:53:36
您可以从parent获取子项
<set name="subdirs" lazy="false" cascade="all-delete-orphan" inverse="true">
<key column="parentid " />
<one-to-many class="DirObject" />
</set>父项来自子项
<many-to-one name="parent" class="DirObject">
<column name="parentid" />
</many-to-one>发布于 2009-12-08 04:01:46
我相信这会成功的..。完全未经测试。
<hibernate-mapping>
<class name="my.proj.DirObject" table="category">
...
<set name="subDirs" lazy="true" inverse="true">
<key column="parentId"/>
<one-to-many class="my.proj.DirObject"/>
</set>
<many-to-one name="parent"
class="my.proj.DirObject"
column="parentId" cascade="all" />
</class>
</hibernate-mapping>发布于 2009-12-08 05:08:38
您实际上可以拥有以下Java实体:
public DirObject {
int id;
String name;
DirObject parent;
List<DirObject> subdirs;
...
}并将其映射到DIROBJECT表中:
ID int NOT NULL,
NAME varchar(255) NOT NULL,
PARENTID int NOT NULL);使用以下映射:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="mypackage">
<class name="DirObject" table="DIROBJECT">
<id name="id" type="int">
<column name="ID" />
<generator class="native" />
</id>
<property name="name" type="string">
<column name="NAME" length="150" not-null="true" unique="false" index="NAME" />
</property>
<bag name="subdirs" lazy="false" cascade="all-delete-orphan" inverse="true">
<key column="PARENTID" />
<one-to-many class="DirObject" />
</bag>
<many-to-one name="parent" class="DirObject">
<column name="PARENTID" />
</many-to-one>
</class>
</hibernate-mapping>https://stackoverflow.com/questions/1862457
复制相似问题