示例:一个类别(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. ios专题 - CocoaPods - 初次体验

    [原创]http://www.cnblogs.com/luoguoqiang1985 这CocoaPods怎么用呢? 参考官方文章:guides.cocoapods.org/using/using-c ...

  2. 找不好重现的bug的一个小技巧————守株待兔

    最近碰到一个问题就是数据库中偶尔出现一条没有id的数据,可恨的是怎么也找不到重现这个问题的原因,只好换种方式来找了,那么就是我标题所说的守株待兔方法. 因为我发现出现bug的数据库里面的数据有个字段为 ...

  3. 理解MySQL——索引与优化(转)

    写 在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点.考虑如下情况,假设数据库中一个表有10^6条记录,DBMS的页 面大小为4K,并存储100条记录.如果没有索引,查 ...

  4. .net平台下socket异步通讯

    1,首先添加两个windows窗体项目,一个作为服务端server,一个作为客户端Client 2,然后添加服务端代码,添加命名空间,界面上添加TextBox控件 using System.Net; ...

  5. js 中特殊形势的函数-匿名函数的应用

    javascript中的匿名函数,那什么叫做匿名函数? 匿名函数就是没有函数名称:演示代码: <script> function(x,y){ return x+y //这个就是一个匿名函数 ...

  6. Xcode-01ARC / Block

    1.nonatomic 2.assign 3.strong 4.weak 5.instancetype 6.@class @property 使部分类在编译时不使用ARC -(可以让这们支持 reta ...

  7. 微信JS-SDK签名signature错误代码4029

    一般是url的错,url需要动态获取 c#的写法: //Request.Url.ToString()这个获取的是没有端口号的有些网站有端口号 string url = Request.Url.Orig ...

  8. iOS 开发常用的一些工具

    http://www.itjhwd.com/ios-tool/ 通用工具 HomeBrew:OS X上非常出色的包管理工具. 源码控制 Git:分布式版本控制系统和源码管理系统,其优点是:快和简单易用 ...

  9. struts文件上传拦截器中参数的配置(maximumSize,allowedTypes ,allowedExtensions)问题

    <interceptor-ref name="fileUpload"> <param name="allowedTypes">image ...

  10. C++ 利用socket实现TCP,UDP网络通讯

    学习孙鑫老师的vc++深入浅出,有一段时间了,第一次接触socket说实话有点儿看不懂,第一次基本上是看他说一句我写一句完成的,第二次在看SOCKET多少有点儿感觉了,接下来我把利用SOCKET完成T ...