示例:一个类别(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. Java stackoverflow error

    本文想记录一下尝试产生stackoverflow的程序 1 -Xss=1k, 设置stack大小1024个字节,产生515个long,想把stack撑爆. 2 嵌套调用 3 创建大量线程 1 -Xss ...

  2. 【实习记】2014-08-20实习的mini项目总结

        实习项目总结文档 项目介绍 项目逻辑很简单,只有几个页面,只能登录,查看,支付和退款.主要作用是熟悉C++的cgi的web服务开发方式. 项目页面截图 图一:登录页面 图二:买家查看 图三:买 ...

  3. vs2008生成的各种文件

    一.sln文件     .sln(Solution)解决方案文件,表示一个项目组,他通常包含一个项目中所有的工程文件信息.   二.suo文件     suo(Solution User Option ...

  4. 修改EditText的光标位置

    Android 的 EditText 控件默认获取焦点的时候, 插入光标是在第一个位置的,如果EditText中设置了文本, 这个时候光标是在文本的最前面, 而不是文本的最后. 为了方便用户使用, 需 ...

  5. SQL*Net message from client

    SQL*Net message from client The server process (foreground process) waits for a message from the cli ...

  6. 第k大数问题

    解法1: 我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn + k). 解法2: 利用选择排序或交互排序,K次选择后即可得到第k大的数.总的时间复杂度为O( ...

  7. bzoj2165

    类似于bzoj1706,考虑到楼层是等价的我们令f[p,i,j]为用了2^p次电梯,从房间i到j最多上升了多少层然后从2^p很容易推到2^(p+1),类似于floyd的转移即可下面我们要用最小的电梯次 ...

  8. poj2151

    求每只队伍都回答出题目,且至少有一只队伍回答出n道题的概率存在性问题我们可以转化为任意性问题用P(每支队伍都回答出题目)-P(每只队伍回答的题目数小于n)然后我们可以递推求解 ..,..,..] of ...

  9. WordPress Simple Login Registration插件’username‘参数跨站脚本漏洞

    漏洞名称: WordPress Simple Login Registration插件’username‘参数跨站脚本漏洞 CNNVD编号: CNNVD-201308-519 发布时间: 2013-0 ...

  10. BZOJ3439: Kpm的MC密码

    3439: Kpm的MC密码 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 166  Solved: 79[Submit][Status] Descr ...