Hibernate基础
JPA
JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。Hibernate就是JPA的一种实现。
JPA与Hibernate的 区别
- JPA DAO层注入
- @PersistenceContext
- private EntityManager em;
- Hibernate DAO层注入
- @Resource/@Autowired
- private SessionFactory sessionFactory;
ACID特性
- 原子性(atomic)
整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 - 一致性(consistent)
一个事务可以封装状态改变(除非它是一个只读的)。事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。
也就是说:如果事务是并发多个,系统也必须如同串行事务一样操作。其主要特征是保护性和不变性(Preserving an Invariant),以转账案例为例,假设有五个账户,每个账户余额是100元,那么五个账户总额是500元,如果在这个5个账户之间同时发生多个转账,无论并发多少个,比如在A与B账户之间转账5元,在C与D账户之间转账10元,在B与E之间转账15元,五个账户总额也应该还是500元,这就是保护性和不变性 - 隔离性(insulation)
隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。 - 持久性(Duration)
在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
数据库事务隔离级别
- Serializable 串行化
- Repeatable Read 可重复读
- Read Commited 可读已提交
- Read Uncommited 可读未提交
悲观锁
它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。
- SQL
select * from account where name=”Erica” for update
- Hibernate
get(Class clazz, Serializable id, LockOptions lockOptions);
LockOptions.UPGRADE
乐观锁
- @Version注解,属性类型:
- 数字类型
int/Integer
short/Short
long/Long - Date类型
java.sql.Timestamp
- 数字类型
Hibernate对象四种状态
瞬时态(new, or transient)
当new一个实体对象后,这个对象处于瞬时态,即这个对象只是一个保存临时数据的内存区域,如果没有变量引用这个对象,则会被JVM的垃圾回收机制回收。
这个对象所保存的数据与数据库没有任何关系,除非通过Session的save()、saveOrUpdate()、persist()、merge()方法把瞬时态对象与数据库关联,并把数据插入或者更新到数据库,这个对象才转换为持久态对象。
持久态(managed, or persistent)
持久态对象的实例在数据库中有对应的记录,并拥有一个持久化标识(ID)。
对持久态对象进行delete操作后,数据库中对应的记录将被删除,那么持久态对象与数据库记录不再存在对应关系,持久态对象变成移除态(可以视为瞬时态)。
持久态对象被修改变更后,不会马上同步到数据库,直到数据库事务提交。
游状态(detached)
当Session进行了close()、clear()、evict()或flush()后,实体对象从持久态变成游离态,对象虽然拥有持久和与数据库对应记录一致的标识值,但是因为对象已经从会话中清除掉,对象不在持久化管理之内,所以处于游离态(也叫脱管态)。
游离态的对象与临时状态对象是十分相似的,只是它还含有持久化标识。
实体映射相关注解
@Entity @Table
@Column @Id
@ManyToOne @JoinColumn
@OneToMany(mappedBy)
@ManyToMany @JoinTable
@OneToOne @JoinColumn @PrimaryKeyJoinColumn
@OneToOne(mappedBy)
hibernate关系注解
- @ManyToMany
默认:fetch - LAZY - @JoinTable
mappedBy - 关联对象的属性,放弃对关系数据的管理 - @ManyToOne @JoinColumn
默认:fetch - EAGER - @OneToMany
默认:fetch - LAZY
mappedBy
实体映射的基本原理
当通过hibernate获取到PO实体对象时,hibernate生成了该实体类(例如:User)的子类(代理类),其内部缓存了hibernate的session
当我们懒加载PO(User)的关联数据时(例如:getRoles()),就会调用session进行数据库查询
缓存
一级缓存 - session级别
get/load/iterate
二级缓存 - SessionFactory级别
配置参数
hibernate.cache.use_second_level_cache=true
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
hibernate.cache.provider_configuration_file_resource_path=ehcache.xml
实体类上配置注解
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
查询缓存可以在一级或者二级缓存
缓存Query对象的list或者getResultList
配置参数
hibernate.cache.use_query_cache=true
使用时设置
Query.setCacheable(true)
声明
以上内容为我的学习心得,概括的不详细,如有错误,敬请提出。欢迎关注微信公众号,大家一起进步。。