缓存
一级缓存一级缓存在session内部,又称为session缓存/事务缓存,随着session的关闭而消失。
原理session缓存会通过主键查找对应记录,如果缓存中没有,则从数据库加入缓存。
管理一级缓存作用于太小,不能自定义配置。
常用方法
常用方法
功能
clear()
清空缓存
flush()
刷新缓存,同步数据库
setReadOnly()
设为只读
二级缓存二级缓存由SessionFactory管理,是整个应用程序的缓存。Hibernate自带的二级缓存很鸡肋,常用第三方二级缓存。
适用范围
缓存适合经常读取,修改不平凡的数据。
不适合经常修改、高并发、数据共享的数据。
应合理设计缓存,提高缓存命中率,减小缓存大小。
## EHCache
EHCache支持只读、不严格读写、读写、将缓存写入文件等。
配置
在hibernate.cfg.xml中设置cache.provider_class
12345678<session-factory> <!--EhCacheProvider已弃用,改用EhCacheRegionFa ...
SQL
声明123//已弃用,其他方法不变//SQLQuery query = session.createSQLQuery(String sql);NativeQuery<POJO类名> sqlQuery = session.createNativeQuery(sql,POJO类名);
绑定实体类123query.addEntity(实体类);//当表有别名时可以使用:query.addEntity("别名", 实体类);
设置类型转换123当没有设置实体类时,需要手动设置类型转换以提高性能。//Hibernate.TYPE已弃用,使用StandardBasicTypes.TYPEsqlQuery.addScalar("字段名", StandardBasicTypes.TYPE);
占位符占位符同HQL占位符
HQL
## 说明
Hibernate Query language,语法同SQL基本一致,但其中使用的实体类和类的属性,而非表名和表的列名
声明1Query query = session.createQery(String hql);
查询list返回List对象
1List<POJO> list = query.list();
iterate返回Iterator对象
1Iterator<POJO> it = query.iterate();
list和iterate的区别
list会一次性查询所有结果。
iterate会一次性查询所有主键,并在调用 iterator.next()时优先查询缓存中该主键对应的记录。
iterate会更好的利用缓存。
select选择多个列时,返回List<Object[]>列表
占位符?和PreparedStatement一样,可以使用占位符’?’
1query.setType(index, value); //index从0开始
使用名称在需要设置占位符的地方使用 ‘:占位名’
1query.setType( ...
表映射配置文件(mapper)
常规映射123456789101112131415<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping> <class name="POJO类(含包名)" table="表名" schema="数据库名"> <id name="类中对应属性" type="对应JAVA类型"> <column name="主键列名" sql-ty ...
Can't find any matching row in the user table
没有刷新权限表
1flush privileges;
该用户没有密码
1GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'HOST' IDENTIFIED BY 'mypassword' WITH GRANT OPTION; FLUSH PRIVILEGES;
Criteria
功能完全隐藏了SQL,使用面向对象的方式查询,简称QBC/QBE。
声明1Criteria criteria = session.createCriteria(POJO类名); //from
常用方法
常用方法
说明
等价SQL
session.createCriteria(POJO类名);
选择表
from
criteria.createCriteria(“POJO类名”);
选择其他表
from
setProjection(Projection)
选择一个统计列
select
setProjection(ProjectionList)
选择多个列
select
setProjection(Property)
选择一个列
select
setProjection(PropertyProjection)
分组
group by
add(Criterion)
添加一个查询条件
where
addOrder(Order)
添加一个排序条件
order by
createAlias()
创建关联查询
join
createCriteria(S ...
关系映射
概念映射数据库中,表之间存在一对一、一对多、多对多关联关系,相应的,hibernate中也存在这些关联关系,称之为映射
单向关联在一的一方,可以使用Set、List、Map、Bag等类型存储与多的一方的关联对象,并支持级联(cascade)。
此时,一的一方知道多方的存在,而多方不知道一方,则是单向关联
双向关联如果,多方也存有一方的对象,则是双向关联
控制反转https://www.cnblogs.com/whgk/p/6135591.html
当在多方插入数据时,会先插入内部的一方数据,再插入自己
当在一方插入数据时,也会向插入内部的多方数据,在插入自己,再更新多方数据的主键
所以一般在一方设置控制反转,当在一方使用保存时,调用多方的保存方法
即,使用多方的级联,一方的级联失效
一对多Set说明
Set是不重复的无序的集合,是数据库集合中最常用的一种(数据库中的记录一般是无序的,不重复的)。
Set在多方声明,用于保存于本记录关联的多方记录
声明var必须声明为Set接口,不得使用具体类型
并设置其getter、setter
1private Set<多方类型> ...
对象生命周期
Transient(临时)未与数据库某记录有映射的对象
Persistent(持久)已与数据库某记录有映射关系的对象
Detached(独立)数据库连接断开后的对象
Removed(已删除)该对象对应记录已被删除,该对象不应再使用
脏数据因为Transient和Detached不受Session控制,即脱离Session的对象修改后即为脏数据。
连接池
自带连接池当没有指定连接池时,默认使用自带连接池,仅用于开发测试
Tomcat的连接池C3P0
maven导入C3P0
12345<dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version></version></dependency>
hibernate添加配置使用C3P0
123456789<property name="connection.provider_class"> org.hibernate.c3p0.internal.C3P0ConnectionProvider</property><property name="hibernate.c3p0.min_size">5</property><property name=&quo ...
Session
说明
Session用于事务管理、增删查改等,相当于JDBC的Connection。可使用Transaction代替事务操作。
Session只能通过SessionFactory获取
Session不建议多线程共享使用。
事务管理开启事务1session.beginTransaction();
事务提交1session.getTransaction().commit();
事务关闭1session.close();
使用Transaction代替session事务管理详见 Hibernate结构:Transaction
查询get说明通过主键值查找记录,并将记录自动赋值给该POJO对象
返回POJO,当找不到该记录时,返回null
声明1get(POJO类名, 主键值);
示例1StudentEntity studentEntity = session.get(StudentEntity.class, "0123456");
load说明同get
与get的区别当找不到该记录时,抛出异常
删除delete说明删除与指定POJO对象的主键对应的记录
返回无 ...