自身跟自身的一对多关联

什么时候会出现自身一对多关系呢?下面举个例子.

淘宝店里商品分类,一级分类:家用电器,个人化妆,运动户外等

家用电器下面二级分类:大家电,生活电器,厨房电器等

二级分类大家电下的三级分类:平板电视,空调,冰箱,洗衣机等.

 

像这样的关系如何在数据库表中体现呢?

我们创建一个分类category表,专门用来存储类别.并定义一个parent_id字段和level等级字段.用来记录分类级别的信息,其中parent_id是外键,其主键就是自身的id

 
 

数据库表创建好了,下面通过Hibernate逆向工程,生成映射文件和持久化类.

category父类和子类的关联关系是一对多的关联关系.因此在持久化类中添加set<Category>用来保存多的一方

 
 
 

第三步:编写测试类

package com.entity;
/**
 * 自身一对多关系案例
 */
import org.hibernate.Session;
import com.util.HibernateSessionFactory;
public class HibernateTest {
 /**
  * @param args
  */
 public static void main(String[] args) {
  HibernateTest hibernateTest = new HibernateTest();
  hibernateTest.addThirdLevel();
 }
 /**
  * 添加一级分类
  */
 public void addFirstLevel(){
  Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  //添加一级分类
  Category c1 = new Category();
  c1.setName("个人化妆");
  c1.setDescription("个人化妆");
  c1.setLevel(1);
  Category c2 = new Category();
  c2.setName("运动户外");
  c2.setDescription("运动户外");
  c2.setLevel(1);
  
  session.save(c1);
  session.save(c2);
  session.beginTransaction().commit();
 }
 /**
  * 添加二级分类
  */
 public void addSecondLevel(){
  Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  //为家用电器添加二级分类
  Category c1 = new Category();
  c1.setName("大家电");
  c1.setDescription("大家电");
  c1.setLevel(2);
  
  Category c2 = new Category();
  c2.setName("生活家电");
  c2.setDescription("生活家电");
  c2.setLevel(2);
  
  //父类
  Category parent = (Category) session.get(Category.class, 1);
  c1.setParentCategory(parent);
  c2.setParentCategory(parent);
  
  session.save(c1);
  session.save(c2);
  session.beginTransaction().commit();
 }
 
 /**
  * 添加三级分类
  */
 public void addThirdLevel(){
  Session session = HibernateSessionFactory.getSessionFactory().getCurrentSession();
  session.beginTransaction();
  //为大家电添加三级分类
  Category c1 = new Category();
  c1.setName("平板电视");
  c1.setDescription("平板电视");
  c1.setLevel(2);
  
  
  Category c2 = new Category();
  c2.setName("空调");
  c2.setDescription("空调");
  c2.setLevel(2);
  
  //父类
  Category parent = (Category) session.get(Category.class, 4);
  c1.setParentCategory(parent);
  c2.setParentCategory(parent);
  
  session.save(c1);
  session.save(c2);
  session.beginTransaction().commit();
 }
 
}
 
查看数据添加结果
 
 

Hibernate映射 --- 自身跟自身的一对多关联的更多相关文章

  1. hibernate映射的 关联关系:有 一对多关联关系,一对一关联关系,多对多关联关系,继承关系

    hibernate环境配置:导包.... 单向n-1:单向 n-1 关联只需从 n 的一端可以访问 1 的一端 <many-to-one> 元素来映射组成关系: name: 设定待映射的持 ...

  2. hibernate映射xml文件配置之一对多,多对多

    一对多配置 [1]班级和学生模型 --->班级可容纳多个学生 --->学生只能属于一个班级 [2]一对多配置中的关系维护(inverse) --->一端放弃关系的维护 ---> ...

  3. Hibernate映射解析——七种映射关系

    首先我们了解一个名词ORM,全称是(Object Relational Mapping),即对象关系映射.ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现,这样开发人员就可以把对 ...

  4. Hibernate映射--基本类映射和对象关系映射(转)

    原文地址:http://blog.csdn.net/lovesummerforever/article/details/20901011   尊重原创,请访问原网址 回想一些我们在没有学习ssh的时候 ...

  5. MyBatis多对一,一对多,多对多,一对多关联查询

    一.Person实体类 1 public class Person { 2 private Integer personId; 3 private String name; 4 private Int ...

  6. (Hibernate进阶)Hibernate映射——一对多关联映射(七)

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

  7. 【SSH系列】Hibernate映射 -- 一对多关联映射

        映射原理       一对多关联映射和多对一关联映射的映射原理是一样一样的,所以说嘛,知识都是相通的,一通百通,为什么说一对多关联映射和多对一关联映射是一样的呢?因为她们都是在多的一端加入一个 ...

  8. 【SSH进阶之路】Hibernate映射——一对多关联映射(七)

    上上篇博文[SSH进阶之路]Hibernate映射——一对一单向关联映射(五),我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份 ...

  9. hibernate一对多关联映射

    一对多关联映射 映射原理 一对多关联映射和多对一关联映射的映射原理是一致的,都是在多的一端加入一个外键,指向一的一端.关联关系都是由多端维护,只是在写映射时发生了变化. 多对一和一对多的区别 多对一和 ...

随机推荐

  1. Alwasyon环境下增加数据文件需要注意的几点

    半夜收到报警短信,服务器磁盘空间不足,爬起来检查一番,发现由于索引重建导致,而且该磁盘下仍有自动增长的数据文件,由于该服务器上其他盘符有剩余空间,于是打算将该磁盘下的数据文件限制增长,并新增几个数据文 ...

  2. C++ OCCI API数据库操作之连接、返回查询结果集为json格式

    使用C++操作数据库,转换返回结果集为json格式,易于解析. 以下程序的编译.运行环境:Windows 10 1803.VS2017 17.5.2(vc14).解决方案配置:Release.解决方案 ...

  3. DOM LEVEL 1 中的那些事儿[总结篇-上]

    DOM是前端编程中一个非常重要的部分,我们在动态修改页面的样式.内容.添加页面动画以及为页面元素绑定事件时,本质都是在操作DOM.DOM并不是JS语言的一个部分,我们通过JAVA.PHP等语言抓取网页 ...

  4. linux02

    Linux Day 21.命令命令格式: chagrp chgrp命令用于变更文件或目录的所属群组. cd change directory 切换目录 格式:cd 路径 ls list 显示当前目录信 ...

  5. Android------------------系统服务调用的学习

    一.ServiceManager的方法: 此方法getService,用于根据名称获取当前的IBinder的代理(并没有直接获取服务), 服务提供的功能是依靠IBinder间接调用的(返回值IBind ...

  6. Code Chef December Challenge 2018题解

    传送门 \(MAXEP\) 二分,不过二分的时候要注意把\(mid\)设成\(\left\lfloor{9l+r\over 10}\right\rfloor\),这样往右的次数不会超过\(6\)次 / ...

  7. 「PKUSC2018」星际穿越(倍增)

    倍增好题啊! 我们我们预处理 \(f[x][i]\) 表示 \(x\) 点最左到达的端点,\(sum[x][i]\) 表示 \(x\) 点最左到达的端点时 \(f[x][i]\sim x\) 的答案, ...

  8. cytoscape.js在vue项目中的安装及案例

    1. 安装: npm i cytoscape --save 2. 引入:main.js import cytoscape from 'cytoscape'; Vue.prototype.$cytosc ...

  9. [Spring]@Autowired,@Required,@Qualifier注解

    @Required注解 @Required注解用于setter方法,表明这个属性是必要的,不可少的,必须注入值 假设有个测试类,里面有name和password两个属性 我给两个属性的setter方法 ...

  10. maven更换源

    1)在 /etc/maven/settings.xml 找到  <mirrors>  </ mirrors>标签,在标签内部 添加内容如下: <mirror>    ...