示例:一个类别(Category)下面有多个子类别,多个子类别属于同一个父类别。
public class Category { private Integer id; private String name; private Category parentCategory; // 父类别 private Set<Category> childCategories = new HashSet<Category>(); // 子类别 // getter and setter }
用XML映射
<hibernate-mapping package="org.monday.hibernate4.domain"> <class name="Category" table="tbl_category"> <id name="id"> <generator class="identity" /> </id> <property name="name" /> <many-to-one name="parentCategory" class="Category" column="category_id" /> <set name="childCategories" inverse="true" cascade="all"> <key column="category_id" /> <one-to-many class="Category" /> </set> </class> </hibernate-mapping>
用@Annotation映射
@Entity @Table(name = "tbl_category") public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; @ManyToOne @JoinColumn(name = "category_id") private Category parentCategory; // 父类别 @OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL) private Set<Category> childCategories = new HashSet<Category>(); // 子类别 //getter and setter }
测试代码
Category foodCategory = new Category("food"); Category fruitCategory = new Category("fruit"); Category vegetableCategory = new Category("vegetable"); Category appleCategory = new Category("apple"); Category orangeCategory = new Category("orange"); Category tomatoCategory = new Category("tomato"); // 建立食品类别和水果类别之间的关联关系 foodCategory.getChildCategories().add(fruitCategory); fruitCategory.setParentCategory(foodCategory); // 建立食品类别和蔬菜类别之间的关联关系 foodCategory.getChildCategories().add(vegetableCategory); vegetableCategory.setParentCategory(foodCategory); // 建立水果类别和苹果类别之间的关联关系 fruitCategory.getChildCategories().add(appleCategory); appleCategory.setParentCategory(fruitCategory); // 建立水果类别和桔子类别之间的关联关系 fruitCategory.getChildCategories().add(orangeCategory); orangeCategory.setParentCategory(fruitCategory); // 建立西红柿类别和蔬菜类别之间的关联关系 tomatoCategory.setParentCategory(vegetableCategory); vegetableCategory.getChildCategories().add(tomatoCategory); session.save(foodCategory);
SQL schema
Hibernate: create table CATEGORYS ( id integer not null, name varchar(255), category_id bigint, primary key (id) ) Hibernate: alter table CATEGORYS add index FK36CF3159B3B4FFA (category_id), add constraint FK36CF3159B3B4FFA foreign key (category_id) references CATEGORYS (id)
-----------------------------改进代码---------------------------
1.改进实体类
@Entity @Table(name = "tbl_category") public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; private String name; @ManyToOne @JoinColumn(name = "category_id") private Category parentCategory; // 父类别 @OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL) private Set<Category> childCategories = new HashSet<Category>(); // 子类别 //getter and setter /** 添加子类别 */ public void addChildCategory(Category category) { if (category == null) { throw new IllegalArgumentException("Can't add a null Category as child."); } // 删除旧的父类别Category if (category.getParentCategory() != null) { category.getParentCategory().getChildCategories().remove(category); } // 设置新的父类别Category category.setParentCategory(this); // 向当前Category对象中加入子类别 this.getChildCategories().add(category); } }
2.测试代码
// 建立食品类别和水果类别之间的关联关系 foodCategory.addChildCategory(fruitCategory); // 建立食品类别和蔬菜类别之间的关联关系 foodCategory.addChildCategory(vegetableCategory); // 建立水果类别和苹果类别之间的关联关系 fruitCategory.addChildCategory(appleCategory); // 建立水果类别和桔子类别之间的关联关系 fruitCategory.addChildCategory(orangeCategory); // 建立西红柿类别和蔬菜类别之间的关联关系 vegetableCategory.addChildCategory(tomatoCategory); session.save(foodCategory);
相关推荐
Hibernate映射一对多关联关系
Hibernate双向一对一关联映射(注解版)
包含《多对多双向关联映射》《多对一单向关联映射》《多对一双向关联映射》《一对多单向关联映射》等文档,并有图解及例子,非常适合新手学习,尤其是刚刚接触hibernate,对映射关系不清楚的。。。。
hibernate双向一对多关联映射(注解版)
Hibernate关联关系映射 单向关联 │ ├─ 一对一外键单向关联 │ ├─ 一对一主键单向关联 │ ├─ 一对一连接表单向关联 │ ├─ 一对多外键单向关联 │ ├─ 一对多连接表单向关联 │ ├─ 多对一外键单向关联 │ ...
Hibernate 一对多外键单向关联 Hibernate 一对多连接表单向关联 Hibernate 多对一外键单向关联 Hibernate 多对一连接表单向关联 Hibernate 多对多单向关联 Hibernate 一对一外键双向关联 Hibernate 一对一主键双向...
hibernate双向一对多关联映射(XML)
hibernate关联映射详解SSH 多对多,一对多关系对象映射
hibernate单向一对多关联映射(注解版)
一个老师可以教多个学生 【一对多映射】 多个学生可以被一个老师教【多对一映射】 部门与员工: 一个部门有多个员工【一对多映射】 多个员工属于一个部门【多对一映射】 1.2:多对多,举例说明: 项目和开发员工:...
student与Score的Map集合关系 student与class的多对一 一对多映射
这个是针对初学Hibernate一对多主键关联映射的源代码 ,希望对初学者有所帮助,开发环境是MyEclipse7.5和HIbernate3.2
Hibernate
博文链接:https://shaqiang32.iteye.com/blog/201309
主要介绍了hibernate一对多(多对一)双向关联映射的用法
该资源包含了一些常用的hibernate关联映射实例。包括一对多,多对多,继承映射,等,是学习hibernate的必备品
hibernate核心,一对多,多对多映射讲解,看了就完全搞明白了
Hibernate 一对多关联映射的测试,主要使用部门与员工的级联关系进行添加测试.
在hibernate中,通常配置对象关系映射关系有两种,一种是基于xml的方式,另一种是基于annotation的注解方式,熟话说,萝卜青菜,可有所爱,每个人都有自己喜欢的配置方式,这个是xml配置的例子
博文链接:https://llying.iteye.com/blog/220809