我们只需要一个表就可以很好的实现无限子结点的树型目录结构了
//1.持久类实现
public class Catalog implements Serializable { private Long id; private Long parentId; private String name; private Catalog parent; private Set children; public Catalog() { super(); }
/** * @return */ public Set getChildren() { return children; }
/** * @return */ public Long getId() { return id; }
/** * @return */ public String getName() { return name; }
/** * @return */ public Catalog getParent() { return parent; }
/** * @param set */ public void setChildren(Set set) { children = set; }
/** * @param l */ public void setId(Long l) { id = l; }
/** * @param string */ public void setName(String string) { name = string; }
/** * @param catalog */ public void setParent(Catalog catalog) { parent = catalog; } public String toString() { return new ToStringBuilder(this) .append("customerId", getId()) .toString(); }
public boolean equals(Object other) { if ( !(other instanceof Catalog) ) return false; Catalog castOther = (Catalog) other; return new EqualsBuilder() .append(this.getId(), castOther.getId()) .isEquals(); }
public int hashCode() { return new HashCodeBuilder() .append(getId()) .toHashCode(); }
/** * @return */ public Long getParentId() { return parentId; }
/** * @param long1 */ public void setParentId(Long long1) { parentId = long1; }
}
//2.配置
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN" "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd"> <hibernate-mapping> <!-- com.kbarol.persistence.Catalog root --> <class name=“net.huisky.test.po.Catalog" table="catalog"> <id name="id" type="long" column="id"> <generator class="native"/> </id> <property name="name" column="name" type="string"/> <property name="parentId" column="parent_id" type="long"/> <set name="children" table="catalog" lazy="false" > <key column="parent_id"/> <one-to-many class="net.huisky.test.po.Catalog"/> </set> <many-to-one name="parent" insert="false" update="false" column="id" class="net.huisky.test.po.Catalog"/> </class> </hibernate-mapping>
//3.数据库表设计
CREATE TABLE `catalog` (`id` INT (5) NOT NULL AUTO_INCREMENT, `name` VARCHAR (10) NOT NULL, `parent_id` INT (5) UNSIGNED DEFAULT '0' NOT NULL, PRIMARY KEY(`id`), UNIQUE(`id`), INDEX(`id`));
//4.相关测试代码
String hql="select catalog from Catalog as catalog where catalog.parentId=:id"; Session session=null; List list=new ArrayList(); try { session=super.openSession(false); Query q=session.createQuery(hql); q.setParameter("id",new Long(0));//查找所有根结点 list=q.list(); for(int i=0;i<parent.size();i++){ Catalog catalog=(Catalog)parent.get(i); out.println("-"+catalog.getName()+"<br>"); Iterator it=catalog.getChildren().iterator(); while(it.hasNext()){//这里只是循环到第二层目录,可以利用递归方法再循环下去,把下面无限制级的子目录查找出来 Catalog c=(Catalog)it.next(); out.println("-----"+c.getName()+"<br>"); Iterator ii=c.getChildren().iterator(); } } 
|