示例:一个类别(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. .NET生成静态页面例子

    主要做法如下: 1.创建网站,并创建一个模板页,template.htm 2.添加一个web窗体Default.aspx 3.在网站下新建文件夹htm,设置该文件夹的属性,确保该文件夹具有可写权限 详 ...

  2. 神经网络中的XOR问题

    XOR问题 解决办法: 网络如图 其中激活函数 ReLU,令 即可解决XOR问题.

  3. ACM YTU 十进制与八进制的转换 (栈和队列) STL栈调用

    十进制与八进制的转换(栈和队列) Description 对于输入的任意一个非负十进制整数,利用栈打印输出与其等值的八进制数. Input 111 Output 157 Sample Input 14 ...

  4. phpstorm集成phpunit(转)

    转自http://blog.csdn.net/zhuziying99/article/details/49028321 phpstorm集成phpunit1.下载phpunit.phar,将该文件放到 ...

  5. Android 学习手札(三) 视图(View)

    在Android 系统红,任何可视化组件都需要从android.view.View类继承.可以使用两种方式创建View对象. · 一种方式是使用XML来配置View的相关属性,然后使用相应的方法来装载 ...

  6. 交叉编译tslib1.4

    cross-compiler: arm-linux-gcc V4.2.1 source code: tslib-1.4.tar.gz #tar zxvf tslib-1.4.tar.gz #./aut ...

  7. 支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url.

    支付宝接口使用文档说明 支付宝异步通知(notify_url)与return_url. 现支付宝的通知有两类. A服务器通知,对应的参数为notify_url,支付宝通知使用POST方式 B页面跳转通 ...

  8. ubuntu 安装apache2,mysql,php5,phpmyadmin等软件

    1.安装apache2  sudo apt-get install apache2  输入Y回车  apache2 安装完成  检测:在浏览器输入localhost 出现It works则成功. 2. ...

  9. 移动web页面使用微软雅黑字体的问题

    很多前端工程师在开发手机页面的时候,发现视觉设计师们喜欢用微软雅黑作为中文字体进行设计,于是写页面的时候也定义 font-family 为微软雅黑,后来发到线上后,细心的产品经理发现页面的字体不是微软 ...

  10. android 代码混淆及问题大集锦

    最近在需要对所开发的项目进行了代码混淆,在android studio中开启代码混淆其实还是挺方便的,不过因为代码混淆产生的问题非常多,特别是对于一些涉及到反射的第三方库经常因为名称的变化导致无法使用 ...