示例:一个类别(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. 网页登陆校验码C#版代码

    [DefaultProperty("Text")] [ToolboxData("<{0}:ValidateCode runat=server></{0} ...

  2. Python 学习笔记(3) - 控制流、函数

    控制流语句if.while.for.break.continue以上从最终作用效果来讲,同学过的其他语言没有什么不同.需要注意的只是语法,而Python 在语法上是如此让人赞叹和喜欢啊. 控制流语句的 ...

  3. AngularJS测试框架 karma备忘

    AngularJS测试框架karma安装 安装karma $ --save-dev 安装karma组件 $ npm install karma-jasmine karma-chrome-launche ...

  4. C语言的指针

    指针是C语言中非常重要的数据类型,那么什么是指针呢? 指针类型就是用来用来存放变量地址的变量,指向某个变量. 指针的一般形式:*指针变量名 int *p; float *p1; “*”是用来说明这个变 ...

  5. 我们说的oc是动态运行时语言是什么意思?

    1.KVC和KVO区别,分别在什么情况下使用?  答:KVC(Key-Value-Coding) KVO(Key-Value-Observing)理解KVC与KVO(键-值-编码与键-值-监看) 当通 ...

  6. fineuploader 上传jquery 控件

    fineuploader 昨天用的一个jquery插件. 可参考这篇文章以前写的 file-uploader  跟 这个跟里面介绍的2个jquery 插件相比.觉得更强大写..版本号都3.9 了….. ...

  7. “未能加载文件或程序集file:///E:/MoneySet.dll或它的某一个依赖项,试图加载格式不正确的程序,行203,位置5. 文件:MReportSet.resx”,

    http://bbs.csdn.net/topics/390334265 1.右键卸载项目2.右键选择编辑工程文件,在打开的文件的最后一行</project>之前加以下内容: <Pr ...

  8. python处理csv数据

    import csv #从文件读取 reader = csv.reader(file(srcFilePath,'rb')) for line in reader: #忽略第一行 if reader.l ...

  9. Class.forName()的理解

    转自:http://blog.csdn.net/yanwushu/article/details/7574713 使用jdbc方式连接数据库时会使用一句代码Class.forName(String c ...

  10. Keil_C51程序调试过程

    调试一般都是在发生错误与意外的情况下使用的.如果程序能正常执行,调试很多时候都是用不上的.所以,最高效率的程序开发还是程序员自己做好规范,而不是指望调试来解决问题. 单片机的程序调试分为两种,一种是使 ...