前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Hibernate学习笔记2

Hibernate学习笔记2

作者头像
Java学习
发布2018-07-25 09:56:51
1.4K0
发布2018-07-25 09:56:51
举报
文章被收录于专栏:java学习
Hibernate学习笔记2

1.Hibernate持久化类与主键生成策略

2.Hibernate持久化对象状态

2.1. 持久化类类三种状态

2.2. 持久化类三种状态切换

3.Hibernate一级缓存

3.1. 示例---演示一级缓存的存在

3.2. 持久化对象具有自动更新数据库能力

为什么持久化对象具有自动更新数据库能力?

3.3. 一级缓存常用API

3.4. Hibernate常用API-Session补充

4.Hibernate关联映射-数据对象三种关系介绍

4.1. 一对一

4.2. 一对多(多对一)

4.3. 多对多

5. Hibernate关联映射-一对多

5.1. 实体类创建

5.2. Hbm映射文件编写

5.3. 测试保存

5.4. 测试单向关联保存

5.5. 双向关联维护

5.6. 对象导航

5.7. 级联删除

5.8. cascade总结

提示:点击下面的“阅读原文”可以查看更多笔记

1. Hibernate持久化类与主键生成策略

定义hbm.xml映射文件和pojo类时都需要定义主键,Hibernate中定义的主键类型包括:自然主键和代理主键:

自然主键:具有业务含义字段 作为主键,比如:学号、身份证号

代理主键:不具有业务含义字段作为主键(例如 自增id),比如:mysql自增主键,oracle序列生成的主键、uuid()方法生成的唯一序列串

建议:企业开发中使用代理主键!

在hbm.xml中可以设置的主键生成策略如下:

主键生成器

描述

increment

代理主键。由hibernate维护一个变量,每次生成主键时自动以递增。问题:如果有多个应用访问一个数据库,由于每个应用维护自己的主键,所以此时主键可能冲突。建议不采用。

identity

代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。比如:mysql的自增主键,oracle不支持主键自动生成。如果数据库支持自增建议采用。

sequence

代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。比如oracle的序列。如果数据库支持序列建议采用。

native

代理主键。根据底层数据库对自动来选择identity、sequence、hilo由于生成主键策略的控制权由hibernate控制,所以不建议采用。

uuid

代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符。此策略可以保证生成主键的唯一性,并且提供了最好的数据库插入性能和数据库平台的无关性。建议采用。

assigned

自然主键。由java程序负责生成标识符。不建议采用。

2.Hibernate持久化对象状态

2.1. 持久化类类三种状态介绍

1.瞬时态:也叫做临时态或自由态,它一般指我们new出来的对象,它不存在OID,与hibernate session无关联,在数据库中也无记录。它使用完成后,会被jvm直接回收掉,它只是用于信息携带。

简单说:无OID 与数据库中的信息无关联,不在session管理范围内。

2.持久态:在hibernatesession管理范围内,它具有持久化标识OID它的特点,在事务未提交前一直是持久态,当它发生改变时,hibernate是可以检测到的。

简单说:有OID 由session管理,在数据库中有可能有,也有可有没有。

3.托管态:也叫做游离态或离线态,它是指持久态对象失去了与session的关联,托管态对象它存在OID,在数据库中有可能存在,也有可能不存在。

对于托管态对象,它发生改变时hibernet不能检测到。

2.2. 持久化类三种状态切换

1.瞬时态(new 出来的)

瞬时------à持久 save saveOrUpdate

瞬时-----à脱管(游离) 手动设置oid

2.持久态 它是由session管理

持久-------à瞬时 delete() 被删除后持久化对象不在建议使用

持久-------à脱管 注意:session它的缓存就是所说的一级缓存

evict(清除一级缓存中指定的一个对象)

clear(清空一级缓存)

close(关闭,清空一级缓存)

3.脱管态 (它是无法直接获取)

脱管-----à瞬时 直接将oid删除

脱管----à持久 update saveOrUpdate lock(过时)

3.Hibernate一级缓存

Hibernate的一级缓存就是指session缓存。

actionQueue它是一个行列队列,它主要记录crud操作的相关信息

persistenceContext它是持久化上下文,它其实是真正缓存。

在session中定义了一系列的集合来存储数据,它们构成session缓存。

只要session没有关闭,它就会一直存在。

当我们通过hibernate中的session提供的一些API例如 save get update等进行操作时,就会将持久化对象保存到session中,当下一次在去查询缓存中具有的对象(OID值来判断),

就不会去从数据库查询,而是直接从缓存中获取。

Hibernate的一级缓存存在的目的就是为了减少对数据库访问。

在hibernate中还有一个二级缓存,它是SessionFactory级别缓存。

3.1. 示例---演示一级缓存的存在

3.2. 持久化对象具有自动更新数据库能力

为什么持久化对象具有自动更新数据库能力?

3.3. 一级缓存常用API

一级缓存特点:

  1. 当我们通过session的save,update saveOrupdate进行操作时,如果一级缓存中没有对象,会将这些对象从数据库中查询到,存储到一级缓存。
  2. 当我们通过session的load,get,Query的list等方法进行操作时,会先判断一级缓存中是否存在,如果没有才会从数据库获取,并且将查询的数据存储到一级缓存中。
  3. 当调用session的close方法时,session缓存清空。

clear 清空一级缓存.

evict 清空一级缓存中指定的一个对象。

refresh重新查询数据库,用数据库中信息来更新一级缓存与快照

3.4. Hibernate常用API-Session补充

update

udpate操作它主要是针对于脱管对象,持久对象具有自动更新能力。

问题1:如果我们直接操作的对象是一个脱管对象,执行update会出现什么情况?

Update操作时,如果对象是一个脱管对象,可以操作,它会将脱管对象转换成持久对象在操作

如果在session中出现相同的oid两个对象,会产生异常

问题2:脱管对象的oid如果在数据表中不存在,会报异常?

所以:在操作中,建议我们通过持久化对象来直接修改其操作。

saveOrUpdate

如果对象是一个瞬时对象 --------执行save操作

如果对象是一个脱管对象---------执行update

如果是一个持久对象-------直接返回

delete

删除一个脱管对象,与session关联,在删除

注意:如果执行delete操作,先删除一级缓存,在删除数据库中的数据。

4.Hibernate关联映射-数据对象三种关系介绍

Hibernate框架基于ORM设计思想,它将关系型数据库中的表与我们java中的类进行映射,一个对象就对应着表中的一条记录,而表中的字段对应着类中的属性。

数据库中表与表之间存在着三种关系,也就是系统设计中的三种实体关系。

4.1. 一对一

原则有两种:

  1. 唯一外键对应:在任意一方添加外键来描述对应关系
  2. 主键对应:一方的主键作为另一方的主键
代码语言:javascript
复制
Class Employee{
         PrivateArchives archives;
}
Class Archives{
         PrivateEmployee employee;
}

4.2. 一对多(多对一)

客户与订单之间一对多关系(多对一)

建表原则:在多的一方添加外键来描述关联关系

代码语言:javascript
复制
Class Customer{
         Private Set<Order> orders;
}
Class Order{
         PrivateCustomer c;
}

4.3. 多对多

例如学生与老师

建表原则:通过一张中间表来描述其对应关系

代码语言:javascript
复制
Class Student{
         Set<Teacher> ts;

}
Class Teacher{
         Set<Student>ss;
}

5. Hibernate关联映射-一对多

我们以客户(Customer)与订单(Order)为例

5.1. 实体类创建

订单
客户

5.2. Hbm映射文件编写

Order.hbm.xml
Customer.hbm.xml

5.3. 测试保存

上面操作是一种双向关联

问题:我们可不可以只保存订单或只保存客户完成保存操作?

5.4. 测试单向关联保存

org.hibernate.TransientObjectException:object references an unsaved transient instance - save the transient instancebefore flushing: cn.itheima.oneToMany.Customer

…………..

这个异常代表提一个持久化对象关联了一个瞬时对象。

我们可以使用级联操作来解决上述的问题.

我们现在要做的是保存订单时保存客户,需要在订单的hbm配置文件中修改

设置cascade=save-update 那么在保存订单时就可以自动将客户保存。

如果我们要完成保存客户时,保存订单

5.5. 双向关联维护

我们在开发中要配置双向关联配置。---------可以通过任意一方来操作对方

在操作代码,尽量来要进行单向关联。------可以尽量资源浪费。

在双向关联中,会存在多余的update语句。

我们可以使用inverse属性来设置,双向关联时由哪一方来维护表与表之间的关系。

Inverse它的值如果为true代表,由对方来维护外键。

Inverse它的值如果为false代表,由本方来维护外键。

关于inverse的取值:

外键在哪一个表中,我们就让哪一方来维护外键。

5.6. 对象导航

5.7. 级联删除

我们在删除客户时,也要删除订单,如果没有做级联,那么这个操作是不允许。

为了维护数据完整性

想要完成操作:我们可以在客户中添加cascade=”delete”;

delete-orphan用法

5.8. cascade总结

使用cascade可以完成级联操作

它可常用取值:

none这是一个默认值

save-update,当我们配置它时,底层使用save update或save-update完成操作,级联保存临时对象,如果是游离对象,会执行update.

delete 级联删除

delete-ophan 删除与当前对象解除关系的对象。

all 它包含了save-update delete操作

all-delete-orphan它包信了delete-orphan与all操作

笔试题:cascade与inverse有什么区别?

cascade它是完成级联操作

Inverse它只有在双向关联情况下有作用,它来指定由哪一方维护外键。

记得分享给身边有需要的人

小编微信:xxf960326

推荐阅读目录

Java学习求职路线(资料、视频、源码、项目实战)

程序员用这5种方式学习编程最无效,停止这些可以少走弯路!

大学毕业刚培训完Java,没有经验怎么找工作呢?

⊙请问你知道什么是栈吗?

⊙看看你对队列的了解有多少?

⊙面试题68(加深你对栈的理解_让你知道什么是栈)

⊙来测试一下你对数据结构中的栈和队列的了解有多少?

⊙面试题63(链表,哈希表)

⊙ 请你对Java中树的了解有多少?

这个培训机构怎么?

JavaEE就业学习路线(给初学者以及自学者一个学习方向)?

Servlet实现一个简单的登录【验证码】功能

二维码生成源码

java学习微信讨论群

Spring学习笔记

Mybatis学习笔记

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-05-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 java学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 2.1. 持久化类类三种状态介绍
  • 2.2. 持久化类三种状态切换
  • 3.1. 示例---演示一级缓存的存在
  • 3.2. 持久化对象具有自动更新数据库能力
  • 3.3. 一级缓存常用API
  • 3.4. Hibernate常用API-Session补充
    • update
      • saveOrUpdate
        • delete
        • 4.1. 一对一
        • 4.2. 一对多(多对一)
        • 4.3. 多对多
        • 5.1. 实体类创建
          • 订单
            • 客户
            • 5.2. Hbm映射文件编写
              • Order.hbm.xml
                • Customer.hbm.xml
                • 5.3. 测试保存
                • 上面操作是一种双向关联
                • 5.4. 测试单向关联保存
                • 5.5. 双向关联维护
                • 5.6. 对象导航
                • 5.7. 级联删除
                • 5.8. cascade总结
                相关产品与服务
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档