Hibernate两个常见问题

简介: 基础

Hibernate对象的状态

临时状态/瞬时状态(transient):刚刚用new语句创建,没有被持久化,无id

不处于session中(没有使用session的方法去操作临时对象),该对象成为临时对象

持久化状态,托管状态(persistent):已经被持久化,加入session的缓存中,session是没有关闭

该状态的对象为持久化对象。

游离状态,脱管状态(detached):已经被持久化,但不处于session中,该状态的对象为游离对象。

删除状态(removed):对象有关联的id,并且在session管理下,但是已经被计划(事务提交的时候,commit)删除,如果没有事务就不能删除

相互转换


介绍一下Hibernate的缓存

答:一、why(为什么要用Hibernate缓存?)

Hibernate是一种持久化层框架,经常访问物理数据库。

为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能

缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,在特定的时刻或事件会同步缓存和物理数据源的数据。

为了提高访问速度,把磁盘或者数据库访问变成内存访问

二、what(Hibernate缓存原理是怎样的?)Hibernate缓存包括两大类:Hibernate 一级缓存和Hibernate二级缓存

1. Hibernate一级缓存又称为”session的缓存”。

session缓存内置不能被卸载,session的缓存是事务范围的缓存(session对象的生命周期通常对应一个数据库事务或者一个应用事务)。

一级缓存中,持久化类的每个实例都具有唯一的OID

2. Hibernate的二级缓存又称为”sessionFactory的缓存”。

由于sessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。

第二级缓存是可选的,是一个可配置的插件,默认下sessionFactory不会启用这个插件。

什么样的数据适合存放到二级缓存中?

1) 很少被修改的数据 (帖子的最后回复时间)

2) 经常被查询的数据 (电商的地点)

3) 不是很重要的数据,允许出现偶尔并发的数据

4) 不会被并发访问的数据

5) 常量数据

扩展:Hibernate的二级缓存默认是不支持分布式缓存的,使用memcache,redis等中央缓存来代替二级缓存

相关文章
|
SQL XML Java
MyBatis常见问题
Mybatis的核心设计理念是基于原生sql进行的,正是由于这个设计理念使得Mybatis相对于Hibernate框架执行效率更高,但是代码的可移植性差,由于Mybatis是一个轻量级的框架,框架本身提供的功能较少,但是使用的灵活性更高
79 0
|
存储 SQL Java
|
存储 SQL Java
Hibernate入门实例
Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
Hibernate入门实例
|
Java 数据库连接 数据库
Mybatis 注解方式操作数据库常见问题
Mybatis 注解方式操作数据库常见问题
Mybatis 注解方式操作数据库常见问题
|
SQL Java 关系型数据库
hibernate(七) hibernate中查询方式详解
之前对hibernate中的查询总是搞混淆,不明白里面具体有哪些东西。就是因为缺少总结。在看这篇文章之前,你应该知道的是数据库的一些查询操作,多表查询等,如果不明白,可以先去看一下 MySQL数据表查询操作详解 ,以至于看这篇文章不用那么吃力。
250 0
|
SQL 监控 druid
Druid常见问题Q&A
欢迎大家使用Druid,常见问题在这里解答,希望对大家有所帮助。
|
SQL XML Java
Hibernate基础配置
@Entity @Table(name = "teacher") // 指定该类对应的表明 public class Teacher {// 实体与 private int id; private String ...
927 0
|
Java 数据库连接
hibernate配置注意事项
1:多对一配置  private Set cjrecordsSet = new HashSet(); 正确 private HashSet cjrecordsSet = new HashSet();错误
543 0