Composite Pattern

Here's an attempt at implementing the Composite Pattern using Hibernate.

http://c2.com/cgi/wiki?CompositePattern

Also see this blog entry for an example using Hibernate Annotations: http://www.theresearchkitchen.com/blog/archives/57

Hibernate Mapping File

<class name="Site" table="Site">
<id name="id" type="java.lang.Integer" unsaved-value="null">
<generator class="native"/>
</id>

<version name="version" type="long"/>
<set name="childrenSites" inverse="true" lazy="true" cascade="save-update">
<key column="parent"/>
<one-to-many class="Site"/>
</set>
<many-to-one name="parent" column="parent" cascade="save-update" class="Site"/>
<property name="description" type="java.lang.String"/>
<property name="namespace" type="java.lang.String"/>
<property name="name" type="java.lang.String">
</class>

 

Mysql table generated by running net.sf.hibernate.tool.hbm2java.CodeGenerator.

mysql> desc site;
+-------------+-------------+------+-----+---------+----------------+
| Field       | Type        | Null | Key | Default | Extra          |
+-------------+-------------+------+-----+---------+----------------+
| id          | int(11)     |      | PRI | NULL    | auto_increment |
| version     | bigint(20)  |      |     | 0       |                |
| parent      | int(11)     | YES  | MUL | NULL    |                |
| description | varchar(64) |      |     |         |                |
| namespace   | varchar(64) |      |     |         |                |
| name        | varchar(64) |      |     |         |                |
+-------------+-------------+------+-----+---------+----------------+
6 rows in set (0.03 sec)

 

Code fragement showing getChildrenSites() and getParent();

List sites = session.find("FROM Site AS site");
System.out.println("Number of sites returned: " + sites.size());
Iterator iter = sites.iterator();
while (iter.hasNext()) {
Site site = (Site) iter.next();
site.getName();
site.getChildrenSites());
site.getParent();
}

 

About searching:

To make searching for it easier, here are the terms usually associated
with each technique:
>1) Interval method: using a low - high interval on each node such that
>all childrens' intervals are subsets of the parent's interval.
Nested Set

>2) Tree-code annotation: as a tree-code attribute (e.g., "1.2.3.4.5")
>such that you can find all children of "1.2.3" using the predicate
>treeCode LIKE "1.2.3.%".
Materialized Path

Typically the weakness of a missing explosion operation in SQL is
misused by object database vendors to sell their wares. My blog entry
about this issue:
http://blog.hibernate.org/cgi-bin/blosxom.cgi/2004/12/04#gettricked