Hibernate的多表操作

一.一对多

1.表设计:主外键关联

2.持久类设计:一方持有多方的set集合,多方持有一方的对象

3.配置文件:一方配置级联操作;一方放弃外键维护

二.多对多关系:

1.表设计:使用中间表来映射关系,各添加一个外键字段

2.持久类设计:互相拥有对方的一个set集合

3.配置文件:默认双方都会维护中间表;如果双方都设置了对方的数据,必须有一方主动放弃外键维护(inverse="true"),否则会造成向中间表中重复添加数据,出现异常.

三.多表查询:

对象导航的延迟加载(lazy属性)使用默认策略:一查多延迟加载,多查一立即加载

关键词:

1.cascade 级联  操作一个对象同时操作其关联对象

一次save操作,发出多条insert语句,让所有的对象都变成持久态;

2.inverse 放弃外键维护  是<oneToMany>(一方)的属性

外键维护有两层含义:1)主外键映射(那条线)   2)外键列正常添值(非null)

能够维护外键的条件:

1)在配置文件中配置了外键关联  2)持有要维护的数据;  3)有维护权

注:inverse="true/false" 只是指定在双方都能维护的时候,默认由哪一方来维护外键,不能决定最终执行维护的是哪一方;

比如:一方不放弃维护权,但是一方不持有多方数据导致无法维护外键(有权利没能力),那只能放弃交给多方来维护外键.

3.对象映射的set集合初始化为什么是0?

节省内存

4.瞬时态异常(一对多):org.hibernate.TransientObjectException:

object references an unsaved transient instance - save the transient instance before flushing:com.itheima.domain.LinkMan

瞬时态异常的发生情景:当你想要省略save操作,却又没有配置级联的时候,有可能会发生(不一定发生)

瞬时态异常的发生条件:在提交事务,数据持久化到数据库的过程中,当其中的一方要维护外键数据却找不到数据(对方没有持久化到数据库),就会发生瞬时态异常

1.没有级联,只保存一方(一方维护外键),在数据库中  一方会因为找不到多方的数据而报出异常

2.没有级联,只保存一方(多方维护外键),在数据库中  一方不需要处理多方的数据,这种情况下不会有异常,但是从表无数据.

3.没有级联,只保存多方(多方维护外键),在数据库中  多方会因为找不到一方而报出异常

4.没有级联,只保存多方(一方维护外键),在数据库中  多方会因为找不到一方而报出异常

案例1演示:长官拿着花名册,到了战场上,点名却找不到士兵

案例2演示:长官到达战场,不需要做什么事儿,等着士兵来报道

案例3演示:士兵到达战场,向长官报到,高喊:"汤姆上尉,你在哪里..."  小沈阳:"对不起,没有上尉"

案例4演示:士兵到达战场,高喊:"我的长官是谁..."(这也是多余update语句的原因)

注意:虽然一方和多方的类都持有对方的数据,但是瞬时态异常是发生在数据库操作的时候,因为无法完成主外键的映射造成的,需要使用的数据没有持久化到数据库;

解决瞬时态异常:很简单,配置级联保存(简单)或者save全部对象(太麻烦),这样的话在数据库中双方都有数据了;

5.cascade和inverse没有直接关系,学习的时候不要搅在一起

原文地址:https://www.cnblogs.com/zhuyesan/p/8542645.html

时间: 2024-08-30 12:50:27

Hibernate的多表操作的相关文章

Hibernate笔记3--多表操作-导航查询

一.一对多操作 1.构造实体类及编写配置文件:     一方: 1 // 一个Customer对应多个linkman 2 private Set<Linkman> linkmans = new HashSet<>(0); 配置: 1 <!-- inverse="true"代表放弃外键维护权 --> 2 <set name="linkmans" inverse="true"> 3 <!-- 配置

Hibernate 自动生产表

hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. 今天就来演示一下Hibernate最初级的操作,使用SchemaExport创建数据表. 1.首先建立POJO类 package com.bjpowernode.hibernate; import java.util.Date; /** * 用户 * @author Longxuan * */ public class User { pri

【框架】[Hibernate]利用Hibernate进行单表的增删改查-Web实例

转载请注明出处:http://blog.csdn.net/qq_26525215 本文源自[大学之旅_谙忆的博客] 前面两篇博客已经将Hibernate的基础知识讲解得差不多了,差不多到写实例的时候了. 本篇只用hibernate进行单表的增删改查. 应用Hibernate,对students表进行增删改查. service层和DAO层,我都是直接写实现类了(因为这里主要是演示一下Hibernate的使用),如果是开发项目,注意一定要写接口! 准备数据库: 首先准备一个students表: cr

借助hibernate自动建表

? Hibernate的ORM关系映射底层框架,为我们的开发提供了很多便利,可以说是一个非常棒的J2EE框架,我这里也不 切入主题,逆向思维,借助hibernate实现快速开发.前提,打算在项目里使用hibernate框架开发底层.仅此而已. 一般情况下,开始一个项目,首先是系统的分析需求,然后就是设计数据库,然后找个数据库客户端开始建表,建字段这是个 漫长的过程,然后开工.如果使用hibernate框架(我当然非常推荐使用),jdbc有点麻烦,很多重复的体力活,也不易维护 拓展.当然我也不否定

09-hibernate单表操作(1)

1,单一主键 2,基本类型 3,对象类型 4,组件属性 5,单表操作 单一主键 常用生成策略: assigned 有程序员生成(手工) native 由数据库底层,如果是mysql是increment,如果是Oracle是sequence. 测试assigned :代码手动给他赋值,不给ID赋值 import java.util.Date; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.

day17 dbutils 和 jdbc 多表操作

day17 dbutils 和 jdbc 多表操作 1. dbutils 框架简化 jdbc 开发 1.1 ResultSetHandler 接口的实现类 2. 用 dbutils 进行事务管理 2.1 正常开发中的转账实现 2.2 ThreadLocal - 线程范围内共享数据 3. jdbc 多表操作(1:n) 3.1 jdbc 多表操作 - 级联 4. jdbc 多表操作(n:m) 5. web 树 Author:相忠良 Email: [email protected] 起始于:June

hibernate学习---单表查询

我们都知道SQL是非常强大的,为什么这么说呢?相信学过数据库原理的同学们都深有体会,SQL语句变化无穷,好毫不夸张的说可以实现任意符合我们需要的数据库操作,既然前面讲到Hibernate非常强大,所以Hibernate也是能够实现SQL的一切数据库操作. 在SQL中,单表查询是最常用的语句,同理Hibernate最常用到的也是查询语句,所以今天就来讲讲Hibernate的单表查询: 今天要将的内容分以下几点: 查询所有 查询结果排序 为查询参数动态赋值 分页查询 模糊查询 唯一性查询 聚合函数查

MySql基本的多表操作

多表操作 交叉查询(笛卡尔积查询): #A表中的每一条记录都对应B表中的所有记录,所以,A和B的交叉查询的条目数即为:A条目数*B条目数 语法: select 列名 from A cross join B where 条件 select 列名 from A,B where 条件 内查询 #A表与B表有主外键关系时,查询外键所对应的主键条目 语法: select 列名 from A inner join B on(A.外键 = B.主键);#显式内查询 select 列名 from A,B whe

Hibernate对象的CRUD操作

1.  Hibernate对象的CRUD操作 1.1.  对象的三种状态 瞬时(Transient) - 由new操作符创建,且尚未与HibernateSession 关联的对象被认定为瞬时(Transient)的.瞬时(Transient)对象不会被持久化到数据库中,也不会被赋予持久化标识(identifier).如果瞬时(Transient)对象在程序中没有被引用,它会被垃圾回收器(garbage collector)销毁.使用Hibernate Session可以将其变为持久(Persis