您的位置:首页 > 其它

Hibernate自身双向一对多关联

2014-04-29 02:53 363 查看
自身双向一对多关联其实是双向一对多(如Customer<----->Order)的特殊情况,以Category为例:



(1)Category类的类框图:



(2)CATEGORIES表的结构:



(3)持久化类Category:

package Bean;
import java.util.Set;
 
publicclassCategory {
    private Longid;
    private Stringname;
    private CategoryparentCategory;
    private Set<Category>childCategories;
 
    public Category(Stringname,Category parent,Set<Category> childs) {
        this.name=name;
        this.parentCategory=parent;
        this.childCategories=childs;
    }
    public CategorygetParentCategory() {
        returnparentCategory;
    }
    publicvoidsetParentCategory(Category parentCategory) {
        this.parentCategory =parentCategory;
    }
    public Set<Category>getChildCategories() {
        returnchildCategories;
    }
    publicvoidsetChildCategories(Set<Category> childCategories) {
        this.childCategories =childCategories;
    }
    public Long getId() {
        returnid;
    }
    publicvoid setId(Long id) {
        this.id = id;
    }
    public String getName() {
        returnname;
    }
    publicvoid setName(String name) {
        this.name = name;
    }
}

(4)对象关系映射文件:Category.hbm.xml

<?xmlversion="1.0"encoding="UTF-8"?>
<!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <classname="Bean.Category"table="categories">
        <idname="id"type="long">
            <generatorclass="increment"></generator>
        </id>
        <propertyname="name"column="name"type="string"></property>
        <many-to-onename="parentCategory"column="category_id"cascade="all" class="Bean.Category"></many-to-one>
        <setname="childCategories"cascade="all"inverse="true">
            <keycolumn="category_id"></key>
            <one-to-manyclass="Bean.Category"/>
        </set>
    </class>
</hibernate-mapping>

说明: <many-to-onename="parentCategory"column="category_id"cascade="all"class="Bean.Category"></many-to-one>中的

column="category_id"指定表中的外键字段名,因为每个子Category只对应一个父Category,所以category_id的类型与所参照表的主

键的类型相同(此处即本表的id)。

(5)在主配置文件中加入映射文件Category.hbm.xml
<mapping
resource="Category.hbm.xml"/>

(6)级联保存Category对象:

package test;
import java.util.HashSet;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import Bean.Category;
 
public classTestCategory {
    private static SessionFactoryfactory;
    static {
        factory =new Configuration().configure().buildSessionFactory();
    }
 
    public staticvoid main(String[] args) {
        Session session = factory.openSession();
        Transaction tx =
null
;
         try {
            tx= session.beginTransaction();
            Category category1=new Category("category1",null,newHashSet<Category>());
            Category category2=new Category("category2", category1,new
HashSet<Category>());
            Category category3=new Category("category3", category1,new
HashSet<Category>());
            category1.getChildCategories().add(category2);
            category1.getChildCategories().add(category3);
            session.save(category1);
            tx.commit();
        }catch(Exception e) {
            if (tx !=null)
                tx.rollback();
            e.printStackTrace();
        }finally{
            session.close();
        }
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: