Hibernate串讲笔记四

七、Hibernate控制的事务

事务保证原子操作的不可分,也就是操作的同时成功或同时失败。

Transaction tran=session.beginTranaction();
tran.commit();
tran.rollback();

以上是事务对象的方法,来实现对事务的支持。

hibernate的事务隔离级别:

hibernate的事务隔离级别和JDBC中大致相同。

设置时要在hibernate.cfg.xml配置

<property name="hibernate.connection.isolation">4</property>

  • 1,读未提交的数据(Read uncommitted isolation)
    2,读已提交的数据(Read committed isolation)
    4,可重复读级别(Repeatable read isolation)
    8,可串行化级别(Serializable isolation)

八、Hibernate的锁(悲观锁,乐观锁)

悲观锁是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行。

  • LockMode.UPGRADE  修改锁,在get()方法中加上这个设置作为第三个参数。
    LockMode.NONE  无锁机制
    LockMode.READ  读取锁
    LockMode.WRITE 写入锁,不能在程序中直接使用

还可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法来设置锁

乐观锁,也就是通过对记录加上某些信息来解决并发访问的问题。

版本检查

要在其表中多加上一列表示版本信息,会在读取时读到这个版本号,并在修改之后更新这个版本号,并且只有版本号相同才会予以更新,如果版本号低,就会抛出例外。

<version name="version" column="version" type="integer" />

时间戳

使用时间戳,是通过最后修改时间来判断是否来做更新操作,也就是只有在最后更新时间之后才会做更新。

<timestamp name="updateTime" column="updatetime"/>

九、Hibernate组件映射

组件不会生成唯一标识,但是也需要对应实体类。

hibernate中可以把一个类的对象当作一个属性组件来使用,并且在使用时会自动创建,所以同一组件对象是不会被两次引用的。

例:

<hibernate-mapping package="alan.hbn.rel.inherit" auto-import="false">
<class name="Guest" table="guest">
<id name="id" column="id" type="long" unsaved-value="0">
<generator class="native"/>
</id>
<property name="userName" column="userName" type="string"/>
<property name="password" column="pwd"     type="string"/>
<property name="birthday" column="birthday" type="date"/>
<component name="homeAddress" class="Address">
<property name="street" column="street" type="string"/>
<property name="zipcode"  column="zipcode"  type="string"/>
</component>
</class>
</hibernate-mapping>

回顾JDBC部分,练习写一个hibernate的DAO实现类。

N、软件的分层初步:

201068-23727109

谁依赖谁就看谁调用谁。

软件的分层设计,便于任务的划分、降低层间的耦合。

结合PMS的设计方法,思考这样分层的好处。

并且,使代码尽量减少重复,可复用性好,扩展余地加大,而且尽量减少硬编码。

需求:实现对Person类的数据库持久化基本操作(CRUD)。

包结构:

201068-23746750


如果给你带来帮助,欢迎微信或支付宝扫一扫,赞一下。