自身跟自身的一对多关联

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

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

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

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

 

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

我们创建一个分类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. .net core 部署 docker (CentOS7)

    最近研究 docker 在Linux 下部署 .net core 项目,在过程中踩了很多坑,网上的资料对我帮助确实大,但有些问题未指明出来. 特地整理一份在发布文档 本文使用的是 root 账号操作, ...

  2. 解决 canvas 绘图在高清屏中的模糊问题

    解决 canvas 绘图在高清屏中的模糊问题 为什么模糊 CSS 像素是一个抽象单位(1 px),浏览器根据某种规则将 css 像素转化为屏幕需要的实际像素值. 在高清屏之前,屏幕上显示一个像素点需要 ...

  3. Python文件与函数练习题

    练习题 文件处理相关 编码问题 请说明python2 与python3中的默认编码是什么? python2默认是ASCII码,python3默认是utf-8 为什么会出现中文乱码?你能列举出现乱码的情 ...

  4. POJ 2501

    #include<iostream> #include<iomanip> #include<stdio.h> #include<string> #inc ...

  5. centos 7 安装 mysql 5.7

    1.环境 Centos 7 2.下载 官方网站https://dev.mysql.com/downloads/mysql/5.7.html#downloads ,选择要下载的版本,centos 7 同 ...

  6. JavaScript -- Window-Interval

    -----031-Window-Interval.html----- <!DOCTYPE html> <html> <head> <meta http-equ ...

  7. Shell脚本 | 抓取log文件

    在安卓应用的测试过程中,遇到 Crash 或者 ANR 后,想必大家都会通过 adb logcat 命令来抓取日志定位问题.如果直接使用 logcat 命令的话,默认抓取出的 log 文件包含安卓运行 ...

  8. JNI的又一替代者—使用JNR访问Java外部函数接口(jnr-ffi)

    1. JNR简单介绍 继上文“JNI的替代者—使用JNA访问Java外部函数接口”,我们知道JNI越来越不受欢迎,JNI是编写Java本地方法以及将Java虚拟机嵌入本地应用程序的标准编程接口.它管理 ...

  9. 编码算法-Base64

    Base64是一种编码算法,因为这种算法只支持64个[可打印字符],所以叫做Base64. 为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换.编码表的大小为2^6=64, ...

  10. 误删centos的ps命令,恢复

    脑子短路将/bin/ps文件删除.发现ps命令无法用了.下面是恢复方法 1,执行rpm -qf /bin/ps 查看ps命令所需要的rpm包 [root@iZm5e727lmif5lZ ~]# rpm ...