Search code examples
javahibernateormhbm

Need help createing the hbm.xml


I'm new to hibernate and I came a cross a problem. I've read all throu the starter guides etc. on the hibernate website and I still can't come up with a solution.

I have a class like this:

public class ResultTree {
String attrName;
Map<String, ResultTree> valueMap;
String classValue;
int caseQuant;
Set<Map<String, String>> otherRules;

public String getAttrName() {
    return attrName;
}
public void setAttrName(String attrName) {
    this.attrName = attrName;
}
public Map<String, ResultTree> getValueMap() {
    return valueMap;
}
public void setValueMap(Map<String, ResultTree> valueMap) {
    this.valueMap = valueMap;
}
public String getClassValue() {
    return classValue;
}
public void setClassValue(String classValue) {
    this.classValue = classValue;
}
public int getCaseQuant() {
    return caseQuant;
}
public void setCaseQuant(int caseQuant) {
    this.caseQuant = caseQuant;
}
public Set<Map<String, String>> getOtherRules() {
    return otherRules;
}
public void setOtherRules(Set<Map<String, String>> otherRules) {
    this.otherRules = otherRules;
}

}

How should a hbm.xml for a class like this look? I'm free to create any data structure.

Thanks for the help, MM


Solution

  • With the help of Ranna's solution I managed to model the class by dividing it to two separate classes:

    public class ResultTree {
    private Long id;
    private String attrName;
    private Map<String, ResultTree> valueMap;
    private String classValue;
    private int caseQuant;
    private Set<Rule> otherRules;
    }
    

    and

    public class Rule {
    private Long id;
    private Map<String, String> terms;
    private ResultTree tree;
    private String classValue;
    }
    

    hbm.xml has the following form:

        <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="lib.experiment.result">
        <class name="ResultTree" table="RESULT_TREE">
            <id name="id" column="RESULT_TREE_ID" type="long" />
            <property name="attrName" type="string" column="ATTR_NAME" />
            <property name="classValue" type="string" column="CLASS_VALUE" />
            <property name="caseQuant" type="int" column="CASE_QUANT" />
            <map name="valueMap" table="RESULT_TREE_LEAF" lazy="false">
                 <key column="RESULT_TREE_ID"/>
                 <map-key column="ATTR_VALUE" type="string"/>
                 <many-to-many class="ResultTree" />
            </map>
            <set name="otherRules" table="RULE" lazy="false">
                <key column="RESULT_TREE_ID"/>
                <one-to-many class="Rule"/>
            </set>
        </class>
        </hibernate-mapping>
    

    and

        <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <hibernate-mapping package="lib.experiment.result">
        <class name="Rule" table="RULE">
            <id name="id" column="RULE_ID" type="long" />
            <property name="classValue" column="CLASS" type="string" />
            <map name="terms" table="RULE_TERM" lazy="false">
                 <key column="RULE_ID"/>
                 <map-key column="ATTR_NAME" type="string"/>
                 <element column="ATTR_VALUE" type="string"/>
            </map>
            <many-to-one name="tree" class="ResultTree" lazy="false">
                <column name="RESULT_TREE_ID"/>
            </many-to-one>
        </class>
        </hibernate-mapping>
    

    Thanks a lot for the help!