现在的位置: 首页 > 综合 > 正文

Hibernate自身双向一对多关联

2018年05月26日 ⁄ 综合 ⁄ 共 3154字 ⁄ 字号 评论关闭

自身双向一对多关联其实是双向一对多(如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-mapping
PUBLIC"-//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();

        }

    }

}

转载请注明出处:http://blog.csdn.net/jialinqiang/article/details/8672189

抱歉!评论已关闭.