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();
}
}
}
(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();
}
}
}
相关文章推荐
- hibernate(四)一对多单向、多对一双向、自身双向关联
- Hibernate自身双向一对多关联
- hibernate双向多对一(一对多)及自身一对多关联
- Hibernate 双向的自身关联映射
- hibernate映射一对多,双向关系[关联自身],初学例子四
- Hibernate自身双向一对多关联。异常:object references an unsaved transient instance
- Hibernate的学习之路二十(一对多的双向关联保存数据)
- [Hibernate]基于xml和annotation的many-to-many双向关联【学习笔记】
- Hibernate 双向 1 对 1 对象关系映射 —外键关联 下 ,测试 crud
- Hibernate 一对一外键双向关联
- 关于hibernate的多对一单向关联,一对多单向关联,和一对多双向关联的疑惑解答
- Hibernate之关于多对多双向关联映射
- 【Hibernate步步为营】--双向关联一对一映射详解(二)
- Hibernate在关于一对多,多对一双向关联映射
- Hibernate的单向关联和双向关联
- hibernate一对一双向主键关联_XML
- Hibernate关系映射(11)_多对多双向关联
- Hibernate从入门到精通(九)一对多双向关联映射
- Hibernate 一对多连接表双向关联
- hibernate映射多对多,一对一,一对多,自身关联综合应用