示例:一个类别(Category)下面有多个子类别,多个子类别属于同一个父类别。

  1. public class Category  {
  2. private Integer id;
  3. private String name;
  4. private Category parentCategory; // 父类别
  5. private Set<Category> childCategories = new HashSet<Category>(); // 子类别
  6. // getter and setter
  7. }

用XML映射

  1. <hibernate-mapping package="org.monday.hibernate4.domain">
  2. <class name="Category" table="tbl_category">
  3. <id name="id">
  4. <generator class="identity" />
  5. </id>
  6. <property name="name" />
  7. <many-to-one name="parentCategory" class="Category" column="category_id" />
  8. <set name="childCategories" inverse="true" cascade="all">
  9. <key column="category_id" />
  10. <one-to-many class="Category" />
  11. </set>
  12. </class>
  13. </hibernate-mapping>

用@Annotation映射

  1. @Entity
  2. @Table(name = "tbl_category")
  3. public class Category  {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Integer id;
  7. private String name;
  8. @ManyToOne
  9. @JoinColumn(name = "category_id")
  10. private Category parentCategory; // 父类别
  11. @OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL)
  12. private Set<Category> childCategories = new HashSet<Category>(); // 子类别
  13. //getter and setter
  14. }

测试代码

  1. Category foodCategory = new Category("food");
  2. Category fruitCategory = new Category("fruit");
  3. Category vegetableCategory = new Category("vegetable");
  4. Category appleCategory = new Category("apple");
  5. Category orangeCategory = new Category("orange");
  6. Category tomatoCategory = new Category("tomato");
  7. // 建立食品类别和水果类别之间的关联关系
  8. foodCategory.getChildCategories().add(fruitCategory);
  9. fruitCategory.setParentCategory(foodCategory);
  10. // 建立食品类别和蔬菜类别之间的关联关系
  11. foodCategory.getChildCategories().add(vegetableCategory);
  12. vegetableCategory.setParentCategory(foodCategory);
  13. // 建立水果类别和苹果类别之间的关联关系
  14. fruitCategory.getChildCategories().add(appleCategory);
  15. appleCategory.setParentCategory(fruitCategory);
  16. // 建立水果类别和桔子类别之间的关联关系
  17. fruitCategory.getChildCategories().add(orangeCategory);
  18. orangeCategory.setParentCategory(fruitCategory);
  19. // 建立西红柿类别和蔬菜类别之间的关联关系
  20. tomatoCategory.setParentCategory(vegetableCategory);
  21. vegetableCategory.getChildCategories().add(tomatoCategory);
  22. session.save(foodCategory);

SQL schema

  1. Hibernate:
  2. create table CATEGORYS (
  3. id integer not null,
  4. name varchar(255),
  5. category_id bigint,
  6. primary key (id)
  7. )
  8. Hibernate:
  9. alter table CATEGORYS
  10. add index FK36CF3159B3B4FFA (category_id),
  11. add constraint FK36CF3159B3B4FFA
  12. foreign key (category_id)
  13. references CATEGORYS (id)

-----------------------------改进代码---------------------------

1.改进实体类

  1. @Entity
  2. @Table(name = "tbl_category")
  3. public class Category {
  4. @Id
  5. @GeneratedValue(strategy = GenerationType.IDENTITY)
  6. private Integer id;
  7. private String name;
  8. @ManyToOne
  9. @JoinColumn(name = "category_id")
  10. private Category parentCategory; // 父类别
  11. @OneToMany(mappedBy = "parentCategory", targetEntity = Category.class, cascade = CascadeType.ALL)
  12. private Set<Category> childCategories = new HashSet<Category>(); // 子类别
  13. //getter and setter
  14. /** 添加子类别 */
  15. public void addChildCategory(Category category) {
  16. if (category == null) {
  17. throw new IllegalArgumentException("Can't add a null Category as child.");
  18. }
  19. // 删除旧的父类别Category
  20. if (category.getParentCategory() != null) {
  21. category.getParentCategory().getChildCategories().remove(category);
  22. }
  23. // 设置新的父类别Category
  24. category.setParentCategory(this);
  25. // 向当前Category对象中加入子类别
  26. this.getChildCategories().add(category);
  27. }
  28. }

2.测试代码

  1. // 建立食品类别和水果类别之间的关联关系
  2. foodCategory.addChildCategory(fruitCategory);
  3. // 建立食品类别和蔬菜类别之间的关联关系
  4. foodCategory.addChildCategory(vegetableCategory);
  5. // 建立水果类别和苹果类别之间的关联关系
  6. fruitCategory.addChildCategory(appleCategory);
  7. // 建立水果类别和桔子类别之间的关联关系
  8. fruitCategory.addChildCategory(orangeCategory);
  9. // 建立西红柿类别和蔬菜类别之间的关联关系
  10. vegetableCategory.addChildCategory(tomatoCategory);
  11. session.save(foodCategory);

hibernate一对多关系映射(自身关联)的更多相关文章

  1. 菜鸟学习Hibernate——一对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是一对多关系映射例如学生与班级的关系,一个班级对应多个学生.如图: Hibernate中如何来映射这两个的关系呢? 下面就为大家讲解一下: 1.创 ...

  2. hibernate实体xml一对多关系映射

    单向一对多关系映射: 一个房间对应多个使用者,也就是Room實例知道User實例的存在,而User實例則沒有意識到Room實例. 用户表: package onlyfun.caterpillar; p ...

  3. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  4. hibernate的对象/关系映射结果为空,exists查不到值的问题-20190823

    1: hibernate的对象/关系映射 情景:在使用@onetotone/@manytonone时关联结果为空 原因:在使用这个注解的时候,默认的时crossjoin(交叉连接),在进行查询时以及排 ...

  5. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  6. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  7. Hibernate:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

  8. Hibernate学习之关系映射(转)

    一.一对多 "一对多"是最普遍的映射关系,简单来讲就如消费者与订单的关系.一对多:从消费者角的度来说一个消费者可以有多个订单,即为一对多.多对一:从订单的角度来说多个订单可以对应一 ...

  9. Hibernate 中对象关系映射(ObjectRelationMapping)

    1.什么是对象关系映射? 解析:对象-关系映射(Object Relational Mapping,简称ORM,对象关系映射)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术. 简单的说, ...

随机推荐

  1. 小知识 Vector的枚举 和foreach的用法

    package com.java.c.votetor.www; import java.util.Enumeration;import java.util.Iterator;import java.u ...

  2. 自然数e为底数的指数函数的一个小运用

    以自然数e为底数的指数函数: 半衰期: 倍增期:

  3. php利用时间生成随机函数

    date("YmdHis",time()); rand();    生成随机数   当括号内无参数时 系统会以当前时间为种子进行随机数的生成 rand(1,10);  括号里面是生 ...

  4. 日期-用Datapicker实现前一天后一天

    运用了JQuery UI Datepicker 插件和一些常用日期的方法.其中Datepicker的API具体可参考[http://api.jqueryui.com/datepicker/#optio ...

  5. javascript判断设备类型-手机(mobile)、安卓(android)、电脑(pc)、其他(ipad/iPod/Windows)等

    使用device.js检测设备并实现不同设备展示不同网页 html代码: <!doctype html> <html> <head> <meta charse ...

  6. Jquery not选择器实现元素显示隐藏

    初初认识jQuery的not选择器,想要实现的功能是,点击第一个div,显示第二个div,点击第一个div以外的地方,隐藏第二个div. 具体代码如下: <!DOCTYPE html> & ...

  7. 如何设置路由器实现静态IP配置

    一.概述 嵌入式开发者,经常面对这样的环境:PC(windows)+虚拟机(linux)+开发板.我们希望三者都能相互通信,而且可以联网. 对于实验室只提供一根网线,而自己没有额外的增加端口数量的设备 ...

  8. select 模型

    http://www.cnblogs.com/Anker/p/3258674.html http://www.cnblogs.com/cozy/articles/2088128.html http:/ ...

  9. For Aisha(阿伊莎)

    相见时难别亦难,东风无力百花残.by:昂思多,20160524 跟你在一起,没有拘束感,完全就像是在跟亲人对话. 很喜欢这种感觉 虽然才认识不到10天,却就像是认识了好几年的老朋友 真的喜欢叫你“阿伊 ...

  10. 用UIKIT的模态对话框要注意的地方

    XXX,晚上又搞了三个小时左右,才摸清楚. 多个ID要注意唯一性. 而在DJANGO里,每一个循环的唯一性,也有技巧性. 父循环的编号 {{ forloop.parentloop.counter }} ...