hibernate对象与对象的关系,其实是对象与表的关系。
一.一对一
比如一个人对应一张身份证,一个门对应一把钥匙等…
在数据库中两张表,一张表的主键是通过引入另一张表的主键,建外键的关系

card实体类中

private User users;//user对象

user实体类中

private Card card;//card对象

card实体类的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-7-8 12:14:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.ywy.entity.Card" table="CARD"><id name="cid" type="java.lang.Integer"><column name="CID" /><!-- 外键 通过引入user表的uid  class=foreign通过外键的方式生成id--><generator class="foreign"><!--  引入哪一个表的主键 users;名字与在实体类中的名字一致--><param name="property">users</param></generator></id><property name="cumber" type="java.lang.String"><column name="CUMBER" /></property><!-- 实体类中有的对象,在映射文件中都要与之对应--><!-- 映射users的对象 name:与实体类的名称一致 class:对象的类型--><!-- one-to-one一对一--><one-to-one name="users" class="com.ywy.entity.User"></one-to-one></class>
</hibernate-mapping>

user实体类的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-7-8 12:14:40 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.ywy.entity.User" table="USER"><id name="id" type="java.lang.Integer"><column name="ID" /><generator class="native" /></id><property name="uname" type="java.lang.String"><column name="UNAME" /></property><!--  在user类中也有card对象 --><!-- cascade:级联操作  all:级联所有的操作--><one-to-one name="card" class="com.ywy.entity.Card"   cascade="all"></one-to-one></class>
</hibernate-mapping>

删除:删除主表的时候,次表与会删除。除非断绝关系

   //删除--删除主表的同时,会把次表的也删除//Card card=session.get(Card.class, 2);Card card=session.get(Card.class, 3);//断绝关系,就会只删除card的数据,不会删除user//card.getUsers().setCard(null);session.delete(card);

新增:主表的新增,次表也会新增

 //两表新增--主表的新增,次表也会新增Card card=new Card("43060220004439348");User user=new User("小明);//互相设置card.setUsers(user);user.setCard(card);//新增就只用新增主表。因为级联的关系,次表也会新增session.save(user);

修改:修改的时,主表修改,次表不会修改,修改次表的时候,主表也不会影响

  //修改 只修改了card表的内容Card card=session.get(Card.class,4);//修改的时候要注意设置为空,相当于断绝关系card.getUsers().setCard(null);card.setCumber("43068492778339221");   /*//两个表的修改User user=session.get(User.class, 4);Card card=session.get(Card.class, user.getId());user.setUname("小小");card.setCumber("2222222");*/

查询:查询出主表,次表的内容也出来,查询次表,主表内容也出来

//查询全部次表List<Card> list = session.createQuery("from Card").list();for (Card card : list) {System.out.println(card.getCumber()+card.getUsers().getUname());}//查询全部主表List<User> list = session.createQuery("from User").list();for (User card : list) {System.out.println(card.getUname()+card.getCard());}

二.一对多
就比如省份和城市,用户和订单,等…

hibernate中实体类中:
province

 //省份表private Integer pid;private String pname;//一个省份里面有多个城市 是数组--城市集合//多对一 或者 一对多private Set<City> cities=new HashSet<City>();

对应的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-7-9 16:17:42 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.ywy.entity.Province" table="PROVINCE"><id name="pid" type="java.lang.Integer"><column name="PID" /><generator class="native" /></id><property name="pname" type="java.lang.String"><column name="PNAME" /></property><!-- city的集合 --><!-- cascade:全部级联  谁为主谁级联--><!-- 维护关系 inverse:关系反转 现在是多的维护关系城市自己要记住省份  而不是省份要城市强制记住自己少的级联,多的维护关系--><set name="cities" cascade="all"  inverse="true"><!-- 城市是通过pid来找到自己是在哪一个省份里面 --><!-- 就是城市表里面的外键  column:城市表的名称--><key column="pid"></key><!-- 来自哪一个类中 --><!-- 一对多的关系 一个省份里面有多个城市--><one-to-many class="com.ywy.entity.City"></one-to-many></set></class>
</hibernate-mapping>

city

//城市表private Integer cid;private String cname;//之前有pid,现在不需要,有了一个省份对象,里面就包含了pid//private Integer pid;//一个城市或者多个城市 对应一个省份----省份对象//省份对象里面就有省份的id  pid  一个多private Province province;

对应的映射文件

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-7-9 16:17:42 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.ywy.entity.City" table="CITY"><id name="cid" type="java.lang.Integer"><column name="CID" /><generator class="native" /></id><property name="cname" type="java.lang.String"><column name="CNAME" /></property><!-- 没有了--><!-- <property name="pid" type="java.lang.Integer"><column name="PID" /></property> --><!-- column:通过哪一个列关联 --><!-- 多多一的关系,多个城市对应一个省份--><many-to-one name="province" class="com.ywy.entity.Province" column="pid"></many-to-one></class>
</hibernate-mapping>

相应的操作
新增:主表的新增,次表也会新增

//新增所有//创建省份对象Province province=new Province("湖北省");//创建城市对象City c1=new City("武汉市");City c2=new City("襄阳市");City c3=new City("咸宁市");//在省份里面添加城市province.getCities().add(c1);province.getCities().add(c2);province.getCities().add(c3);//在城市里面设置相应的省份c1.setProvince(province);c2.setProvince(province);c3.setProvince(province);//新增省份,城市也会新增 session.save(province);

删除:主表删除,次表也要影响

//删除一个省份同时删除省份对应的城市Province province =session.get(Province.class, 2);session.delete(province);
/*//删除一个城市 删除它的省份City city=session.get(City.class, 10);Province province=session.get(Province.class, city.getProvince().getPid());province.setCities(null);;session.delete(province);session.delete(city);*/

查询:主表查询,要有次表的内容,次表查询,也要有主表内容

 查询一个省份同时查询这个省份对应的城市/*Province p=session.get(Province.class, 2);//先查询出省份,然后在省份中获取到城市集合Set<City> cs = p.getCities();for (City city : cs) {System.out.println(p.getPname()+"   "+city.getCname()+"  "+city.getCid());}

修改:主表修改,次表不会修改

//给一个城市重新设置省份City city=session.get(City.class, 17);Province province=session.get(Province.class, 5);city.setProvince(province);province.getCities().add(city);

三.多对多
有老师和学生,用户和权限等…
老师的实体类中

//一个老师可以有多个学生
private Set<Student2> student2s=new HashSet<Student2>();

映射文件中

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-7-10 18:42:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.yyy.entity.Teacher" table="TEACHER"><id name="tid" type="java.lang.Integer"><column name="TID" /><generator class="native" /></id><property name="tname" type="java.lang.String"><column name="TNAME" /></property><!-- table:两个表的关系表的名字 因为他们的关系在关系表中,不会在自己本身的表里--><!-- 其他的意思和上面一对多的意思一样--><set name="student2s" table="tea_stu"  cascade="all"  inverse="true"><!-- tid:学生通过什么来找自己的老师,通过老师的id--><key column="tid"></key><!-- 学生通过自己的id和老师的id联系--><many-to-many column="sid" class="com.yyy.entity.Student2"></many-to-many></set></class>
</hibernate-mapping>

学生的实体类中

private Set<Teacher> teachers=new HashSet<Teacher>();

映射文件中

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2019-7-10 18:42:51 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping><class name="com.yyy.entity.Student2" table="STUDENT2"><id name="sid" type="java.lang.Integer"><column name="SID" /><generator class="native" /></id><property name="sname" type="java.lang.String"><column name="SNAME" /></property><!-- table:两个表的关系表的名字 因为他们的关系在关系表中,不会在自己本身的表里--><set name="teachers" table="tea_stu"><key column="sid"></key><many-to-many class="com.yyy.entity.Teacher" column="tid"></many-to-many></set></class>
</hibernate-mapping>

增加:

//新增全部
//创建老师和学生对象Student2 s1=new Student2("小明");Student2 s2=new Student2("小明2");Teacher t1=new Teacher("黄老师");Teacher t2=new Teacher("张老师");//要学生认识老师,老师也认识学生t1.getStudent2s().add(s1);t1.getStudent2s().add(s2);s1.getTeachers().add(t1);s2.getTeachers().add(t1);t2.getStudent2s().add(s2);t2.getStudent2s().add(s1);s1.getTeachers().add(t2);s2.getTeachers().add(t2);session.save(t1);session.save(t2);
//找到一个老师添加一个学生Teacher t = session.get(Teacher.class, 1);Student2 stu=new Student2("向敏");t.getStudent2s().add(stu);stu.getTeachers().add(t);session.save(t);

删除:

//找到一个老师删除一个学生Teacher t = session.get(Teacher.class, 2);Student2 s2 = session.get(Student2.class, 2);//直接删除一个学生session.delete(s2);*/

查询:

/*//找到所有的老师 同时找到所有老师的学生List<Teacher> list = session.createQuery("from Teacher").list();for (Teacher teacher : list) {//System.out.println(teacher.getTname());//获取老师中的学生集合Set<Student2> student2s = teacher.getStudent2s();for (Student2 s : student2s) {System.out.println(s.getSname()+teacher.getTname());}}*///找到一个老师找到他所有的学生/*Teacher t = session.get(Teacher.class, 1);Set<Student2> s = t.getStudent2s();for (Student2 student2 : s) {System.out.println(student2.getSname()+t.getTname());}*/

修改:

//找到一个老师修改一个学生的名字Teacher t = session.get(Teacher.class, 1);Student2 stu=session.get(Student2.class, 3);stu.setSname("小鱼");

补: cascade中有的属性
all:关联全部操作
none:不关联 默认值
delete:关联删除
save-update:关联新增和删除
delete-orphan:删除和的当前对象解除关联关系的对象
all-delete-orphan:all和delete-orphan的行为

Hibernate对象与对象的关系相关推荐

  1. (转)Hibernate关联映射——对象的三种关系

    http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射--对象的三种关系 Hibernate框架基于ORM设 ...

  2. Hibernate开发和对象状态

    Hibernate开发和对象状态 Hibernate开发三种方式 1.由Domain object -> mapping->db.(官方推荐) 2.由DB开始,用工具生成mapping和D ...

  3. 一张图说明 函数, 实例(对象), 原型之间的关系

    前言 很多初学者都对函数,实例(对象), 原型之间的关系理不清楚. 网上五花八门的文章很多,要么不知所云,要么是晦涩难懂. 本文意在用最简洁的语言跟示例让初学者理清楚这三者之间的关系,无需理会其内部原 ...

  4. python中简述对象和类的关系_Python学习笔记(七)对象和类

    什么是对象 Python中所有的数据都是以对象的形式存在,无论是简单的数字类型还是复杂的代码模块.在Python中,当我们想要创建属于自己的对象或者修改已有对象的行为时,才需要关注对象的内部实现细节. ...

  5. 构造函数,对象原型,实例对象三者之间的关系

    撸了今年阿里.头条和美团的面试,我有一个重要发现.......>>> 1.构造函数,原型对象,实例对象三者之间的关系 每创建一个函数,该函数都会自动带有一个prototype属性.该 ...

  6. 第十六课、Qt对象间的父子关系------------------狄泰软件学院

    一.Qt对象间的关系 1.Qt对象间可以存在父子关系 (1).每个对象都保存有它所有子对象的指针 (2).每一个对象都有一个指向其父对象的指针 2.当指定Qt对象的父对象时 (1).其父对象会在子对象 ...

  7. ORM进阶之Hibernate 的三大对象

    ORM进阶之 ORM简单介绍 ORM进阶之Hibernate 简单介绍及框架搭 ORM进阶之Hibernate 的三大对象 我们在上一篇博客中讲到了怎样搭建一个Hibernate框架, 提到Hiber ...

  8. Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系

    Java面试题 20在面向对象编程里,经常使用is-a来说明对象之间的继承关系,下列对象中不具备继承关系的是?() A:手机与小米手机 B:企业家与雷军 C:编程语言与Java D:中国与北京 类之间 ...

  9. Java栈内存、堆内存、方法区对对象和引用的关系

    问题:Java栈内存.堆内存.方法区对对象和引用的关系 答案: 1.单个对象 如图所示: (1)首先类加载器加载要运行的类,首先将main方法加载进方法区,并进栈内存,顺序执行代码,创建对象,将对象的 ...

最新文章

  1. 深入sql server中的事务
  2. Angular 如何根据一个 class 的定义和数据,动态创建一个该类的实例
  3. 使用Gradle的简单Spring MVC Web应用程序
  4. OpenGL 库 简介
  5. RuntimeException:java.lang.ClassNotFoundException: Class wordcount.WordCountMapper not fonud
  6. ASP.NET Core学习之五 EntityFrameworkCore
  7. java fx 多个窗口_JavaFX Scene Builder(窗口各种设置)
  8. JDBC的批量查询报告内存溢出解决方法
  9. ArcGIS GDB中要素类不可编辑
  10. VS2005 中网站转为Web应用程序的方法
  11. [matlab也能用来机器学习!?]保存工具箱模型并使用模型预测结果
  12. 中兴新支点操作系统_中兴新支点系统预装测试
  13. arduino和单片机的区别是什么
  14. 核心技术解析:移动端车牌识别系统方案
  15. [Android UI] graphics
  16. 【观察】数字中国的新机遇,神州数码的新角色
  17. Threejs系列--14游戏开发--沙漠赛车游戏【纹理贴图之loading加载】
  18. 网络互联复习(二) 精简版
  19. Python 数据类型详解(字符串)
  20. 作为开发者必须知道的5个安卓应用推广方式

热门文章

  1. RISC-v 启动流程
  2. 注册表里如何添加开机启动项
  3. ZHS16GBK编码中汉字缺失
  4. 疯狂天才乔治·霍兹:17岁黑掉苹果,22岁搞垮索尼,还是特斯拉、谷歌最可怕的对手!...
  5. 伦敦大学学院 机器人与计算机,伦敦大学学院医学机器人与人工智能
  6. 首尔半导体WICOP双色LED被用于2020款奥迪A4前灯
  7. linux在指定行添加内容,linux下利用shell在指定的行添加内容的方法
  8. 使用XINCheck SDK开发查重系统
  9. 【iOS开发】---- 网站或技术论坛
  10. 笔记之Python网络数据采集