Hibernate自身双向一对多关联

自身双向一对多关联其实是双向一对多(如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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值