---------------------》》》》》》》》》》》》》hibernate01_basic
hibernate 基本知识
1.Configuration 调用config()默认加载类路径下的hibernate.cfg.xml配置
2.SessionFactory 管理Session,缓存,事务
3.Session非线程安全的,一个session会话只能由一个线程执行
4.hibernate默认不提交事务,需手动提交
5.通过xxx.hbm.xml配置实体类映射文件
6.通常,开发中都是先设计表,再使用注解将实体类与数据库表之间建立映射关系,很少通过配置文件来进行关联的,都用注解映射。
7.最重要的一点:一个业务逻辑单元放在一个事务中进行操作!!!
---------------------》》》》》》》》》》》》》hibernate02_hibernateUtil
封装一个标准的hibernate工具类
标准的异常抛出
---------------------》》》》》》》》》》》》》hibernate03_ObjectStatus
1.HIbernate对象的状态
瞬时:与数据库无关,与session无关
直接通过new产生
持久:与数据库相关联,与session相关联,被session管理
使用get(),load()方法加载到内存中的对象
分离:与数据库关联,与session无关
从持久状态转换过来的对象
2.对象的生命周期/状态转换
通过session对象的以下方法将对象的状态进行转换
affects all instances in a Session :
瞬时(Transient)--->持久
save(),saveOrUpdate() 被session管理,数据库增加/更新一条记录
持久(Persistence)--->瞬时
delete() 不被session管理,数据库记录被删除
离线(Detached)--->持久
update(),saveOrUpdate() 重新被session管理
持久--->离线
evict(),clear(),close() 脱离session管理,数据库记录不发生变化
3.hibernate必须理解的
优化:
优化SQL语句的发出时机,尽可能在一次会话中完成插入、更新、删除
实现机制:在事务提交的时候再进行增,删,改语句的发出
除非,必须立刻发出,如主键id依赖于数据库,就会立即发出insert语句
懒加载机制延迟查询语句的发出:
先从一二级缓存查找,无,才发出查询语句
除非真正调用到非id属性而且缓存中没有该对象时,才发出查询语句,而且不关联查询
缓存:
缓存机制,默认使用以及缓存,通过Session来管理
可配置二级缓存,通过第三方缓存框架实现
可配置查询缓存,通过第三方缓存框架实现
关联关系:
分析对象之间应该建立何种关联?一对一?多对一?多对多?
---------------------》》》》》》》》》》》》》hibernate04_IdGenerator
Hibernate主键生成方式
native
主键生成工作交由数据库完成,依赖于数据库的类型,由数据库自动选择identity,sequence,hilo中的一种,hibernate不管
assigned
手动维护主键,hibernate不管
sequence
oracle数据库主键自增序列
identity
MySql或SqlServer数据库的主键自增字段
hilo
uuid(universal unique identifier)
uuid使用一个128-bit的uuid算法生成的字符串类型的标识符,uuid被编码为一个32位的16进制数字的字符串
UUID包括:IP地址,JVM启动时间,系统时间和一个计数器值(JVM中唯一)
hibernate会算出一个128位的唯一值插入
UUID的使用目的:
让分布式系统中所有的元素,都具有唯一的辨别资讯,不需要额外的辨别工作。
每个人都可建立于其他人不会冲突的uuid,这样就不用考虑数据库建立时名称冲突的问题。
UUID经常用来生成主键值完全唯一的情况,是全局的标识符,不会重复!
联合主键的配置
<composite-id name="id" class="StudentId">
<key-property name="firstname" type="string"></key-property>
<key-property name="lastname" length="10"></key-property>
</composite-id>
联合主键的类需要实现序列化接口!
大对象存储
Clob:文本大对象,最大4G
Blob:二进制大对象,最大4G
组合映射
造成数据库大量冗余,不推荐
如Address,“北京--海淀--xxx街”,多条记录如果地址相同,就冗余了
可使用多对一关联来替代组合映射!
---------------------》》》》》》》》》》》》》hibernate05_many2oneTwoWay
1.多对一双向关联
要点:
一的一方使用Set集合,集合使用泛型
关系的维护在多的一方维护
命名准确,写配置文件的时候一目了然
一般使用双向关联(从双方都可以获取到对方的数据)
many:
<hibernate-mapping package="org.hqh.hibernate.model">
<class name="Employee" table="emp">
<id name="empid">
<generator class="native"></generator>
</id>
<property name="name" type="string"></property>
<property name="age" type="integer"></property>
<!--
定义外键
name属性描述多方中类的外键属性 class描述被参考的那方
-->
<many-to-one name="department" cascade="save-update" lazy="false">
<!-- 多方表中增加一个外键,给外键取别名【此处的column只是给外键起别名,不定义也可】 -->
<column name="ref_deptid"></column>
</many-to-one>
</class>
</hibernate-mapping>
one:
<hibernate-mapping package="org.hqh.hibernate.model">
<class name="Department" table="dept">
<id name="deptid">
<generator class="native"></generator>
</id>
<property name="name" type="string"></property>
<!-- 一方的集合属性 -->
<!-- inverse=true 强制在多方维护关联,在一方进行操作不会对关联造成任何影响
inverse=false 可以在一方维护关系,将发出多余的update语句来更新多方的外键,效率低
laze=extra 延迟加载,并且hibernate将查询语句优化了,如判断集合的size时发出count(*)而不是查出所有的元素
-->
<set name="employees" inverse="true" lazy="extra" cascade="save-update">
<!--
key为多方定义的外键名
指定多方定义的外键名,将通过此外键去关联对象【一方通过多方中的外键字段反向关联到多方】
-->
<key column="ref_deptid"></key>
<!-- 指定多方的类名 -->
<one-to-many class="Employee" />
</set>
</class>
</hibernate-mapping>
2.cascade级联属性
all:增删改都级联
save-update:保存employee时发现department未保存,则先保存department,再保存employee
delete:删除department的时候,先删除其下的所有employee,再删除自己(建议不用,防止数据误删)
all-delete-orphan:???
none(默认):不级联
3.inverse反向属性
表示由哪方维护关联关系。
默认为false,双方都可以维护。
如果为true,则强制由多方维护关联关系。
建议使用inverse=true,在多方维护关系
【如果在一方维护关系,会发出多余的update语句来更新多方的外键字段】
---------------------》》》》》》》》》》》》》hibernate06_one2oneTwoWay
一对一关联
1.唯一外键关联(建议使用)
其中一方加一个字段,作为外键引用对方,增加了额外的外键字段
增加字段的一方使用many-to-one定义 并使用unique=true
2.主键关联
双方id主键相同,没有额外的字段
在哪方使用foreign策略呢?
注意:通过一方获取另一方,如果是查询使用了foreign的一方,先发一条查询语句查询出自己,如果要得到对方的数据
会再次发出一条关联查询语句。
如果查询没有使用foreign的一方,将只发出一条关联查询语句
---------------------》》》》》》》》》》》》》hibernate07_many2manyTwoWay
多对多关联
1.如果使用many-to-many,存在以下缺点:
面对集合进行管理,需要复写hashcode(),equals()方法,否则判断集合中的是否contains某个对象将无法判断
由于第三张表中只存在2个字段记录关联,无法存储其它信息,如添加时间等,有局限性
2.拆分多对多为2个多对一关联,将中间表设计为一个实体类,这样做的好处:
按照多对一进行关联关系的维护,简单,不容易出错,避免了对集合进行操作
可以在第三表对应的实体类中扩展其它信息,扩展性好
其中,第三张表作为多的一方,与其它两个实体间构成2个多对一双向关联
---------------------》》》》》》》》》》》》》hibernate08_annotation
使用注解定义实体类之间的映射关系
注:如果已经定义好数据库表,可以通过工具生成实体类和注解
hibernate推荐通过实体类来生成数据库表
1.如果集成了spring,则可通过annotation-scan扫描读取
2.未集成sping,则需要在hibernate.cfg.xml中注册实体类
相关推荐
【Hibernate 基础】是Java开发中一个重要的部分,主要关注如何将对象模型与关系数据库进行映射,以简化数据库操作。本PPT由传智播客制作,旨在帮助学习者掌握Hibernate的基础知识和应用。 首先,我们需要理解基于B/...
hibernate基础jar包。包含junit,antlr,don4j,hibernate-commons-annotations,hibernate-core,hibernate-jpa-api,javassit,jboss-logging,jboss-transaction-api
在本"Hibernate基础包"中,包含了用于SSH开发所需的全部核心库,使得开发者能够快速搭建项目并进行数据库交互。 首先,Hibernate的核心功能在于它的ORM(对象关系映射)机制。ORM允许开发者通过Java对象来操作...
本篇文章将深入探讨`Hibernate基础jar包`的构成,以及它们在Java Hibernate框架中的作用。 首先,Hibernate的核心jar包是实现ORM功能的基础。这些jar包包括但不限于以下: 1. **hibernate-core.jar**:这是...
本资源“Hibernate基础学习源码”提供了五个不同阶段的学习示例,分别命名为Hibernate_01至Hibernate_04以及Hibernate_M2M,涵盖了Hibernate的基本概念、配置、实体映射、CRUD操作以及多对多关系的处理。 1. **...
### Hibernate基础知识点详解 #### 一、什么是对象关系映射(ORM)以及为什么使用ORM? 在企业级应用开发中,持久层(persistence layer)占据了非常重要的地位。它主要负责处理与数据库之间的交互,包括数据的...
在本项目中,"springboot+hibernate基础项目"是一个使用Spring Boot和Hibernate框架构建的典型Java Web应用。Spring Boot简化了Spring的配置过程,而Hibernate则是一个强大的ORM(对象关系映射)工具,使得数据库...
**Hibernate基础知识** 1. **什么是Hibernate**:Hibernate是一个开源的Java ORM框架,它简化了Java应用与关系数据库之间的交互。通过提供一套API,Hibernate可以将Java对象自动持久化到关系数据库中,反之亦然,...
**Hibernate基础全攻略** Hibernate,一个强大的Java对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以专注于业务逻辑而不是繁琐的SQL代码。本篇攻略将深入探讨Hibernate的基础知识,帮助初学者...
**Hibernate 框架概述** Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者用面向对象的方式来处理数据库操作。ORM 解决了在 Java 应用程序中使用传统 JDBC 进行数据库操作时遇到的繁琐代码问题,将...
### Hibernate基础知识点详解 #### 一、Hibernate简介与优势 **Hibernate** 是一款开源的对象关系映射(ORM)框架,它允许开发者以面向对象的方式来处理数据库操作,从而简化了Java应用与关系型数据库之间的交互。...
这个“Hibernate基础架包”包含了进行Hibernate开发所需的基本库文件,使得开发者可以快速地将其集成到自己的项目中,无需手动配置大量的依赖。 在Hibernate中,核心概念包括: 1. **实体(Entities)**:实体代表...
**Hibernate基础教程** Hibernate是一个强大的Java对象关系映射(ORM)框架,它简化了数据库与Java应用程序之间的数据交互。这个基础教程将引导我们逐步了解Hibernate的核心概念和使用方法。 **一、Hibernate概述*...
《Hibernate基础教程》是针对Java开发人员的一本经典教材,主要涵盖了如何使用Hibernate这一流行的ORM(对象关系映射)框架来简化数据库操作。配套代码包"Bh3 2nd Ed Source Code"则提供了实例代码,帮助读者更好地...