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)

声明

       以上内容为我的学习心得,概括的不详细,如有错误,敬请提出。欢迎关注微信公众号,大家一起进步。。
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值