核心:
Configuration类负责管理Hibernate的配置信息,Hiber运行时需要获取一些底层实现基本信息
1.数据库URL
2.数据库用户
3.数据库用户密码
4.数据库JDBC驱动
5.数据库dialect,用于对特定的数据库提供支持,其中包含了针对特定数据库特性的实现
当调用Hibernate时,Hibernate会自动在当前CLASSPATH,中搜寻配置文件,hibernate.cfg.xml,将其读到内存中,作为后继操作的基础配置
Configuration config=new Configuration().configure();
Configuration类一般只有在获取SessionFactory时需要涉及,当获取SessionFactory之后,由于配置信息已经由Hibernate维护并绑定在返回的SessionFactory之上,因此一般情况下无需要再对其进行操作。
也可以不用默认的文件名,使用自定义的文件名,但一定要是.xml格式的
File file=new File("c:/myhibernate.xml"); Configuration config=new configuration().configure(file);
SessionFactory负面创建Session实例
SessionFactory factory=new Configuration().configure().buildSessionFactory();
Session session=new Configuration().configure().buildSessionFactory().openSession();
之后就可以调用Session所提供的save,find,flush等方法完成持久层操作
在事务提交的时候,hibernate自动执行flush方法
当Session关闭时,也会自动执行flush方法
如果不在事务中,去数据进行增、删、改、查,需要使用flush(),强制执行数据库同步
Hibernate是JDBC的轻量级封装,本身并不具务事务管理能力
Hibernate将事务管理委托给底层的JDBC或者JTA
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <!-- Generated by MyEclipse Hibernate Tools. --> <hibernate-configuration> <session-factory> <!--方言 --> <property name="dialect"> org.hibernate.dialect.Oracle9Dialect </property> <!--数据库URL --> <property name="connection.url"> jdbc:oracle:thin:@localhost:1521:orcl </property> <!--数据库访问的用户名 --> <property name="connection.username">accp</property> <!--数据库访问的用户名的密码 --> <property name="connection.password">accp</property> <!--数据库驱动这里是oracle数据库的 --> <property name="connection.driver_class"> oracle.jdbc.OracleDriver </property> <property name="myeclipse.connection.profile">oracle</property> <!--是否显示执行的SQL语句 --> <property name="show_sql">true</property> <!--是否使用数据库外连接 --> <property name="hibernate.use_outer_join">true</property> <!--事务管理类型 --> <property name="hibernate.transaction.factory_class"> <!-- JDBC事务--> net.sf.hibernate.transaction.JDBCTransactionFactory <!-- JTA事务管理--> <!-- net.sf.hibernate.transaction.JTATransactionFactory --> </property> <!--映射文件配置 --> <mapping resource="com/pb/entity/Login.hbm.xml" /> </session-factory> </hibernate-configuration>
// 得到Session Session session=new Configuration().configure().buildSessionFactory().openSession(); // 打开事务 Transaction tran=session.beginTransaction(); // 提交事务 tran.commit();
与下面这段Hibernate只是将JDBC进行封装
//得到数据库连接 Connection dbconn=getConnection(); //将自动提交设置为false dbconn.setAutoCommit(false); //提交 dbconn.commit();
在openSession()中,hibernate会初始化数据库连接,与此同时将AutoCommit设置为关闭也就如上面的设置为false。
在session.beginTransaction()方法中Hibernate会再次确认Connection的AutoCommit属性被设定为关闭状态。
它是为了防止用户代码对Session的Connection.AutoCommit属性进行修改.
也就是说从SessionFactory()中获得的Session,其自动提交属性就已经被关闭.
JTA提供了跨Session的事务管理能力
JTA事务管理则由JAT容器实现,JTA容器对当前加入事务的众多Connection进行调试
JTA的事务周期可横跨多个JDBC Connection生命周期
JTA事务是由JTA Container维护,而参悟事务的Connection无需要事务管理进行干涉.
业务逻辑的实现过程中,往往需要保证数据访问的排他性
给我们选定的目标数据上锁,使用无法被其他程序修改
Hibernate 支持两种锁机制:"悲观锁"(Pessimistic Locking)和"乐观锁"(Optimistic Locking).
指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此在整个数据处理过程中,将数据处于锁定状态
悲观锁的实现往往依靠数据库提供的锁机制,也只有数据库提供的锁机制才能真正保证数据访问的排他性,否则即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据。
Oracle中的悲观锁
select * from login where username='aaaa' for update;
相对于悲观锁而言,乐观锁机制采取了更加宽松的加锁机制
乐观锁,大多是基于数据版本 (Version)记录机制实现。
读取数据时,将此版本号一同读出,之后更新时,对版本号加一,此时提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
可以将乐观锁策略在数据库存储过程中实现,对外只开放基于此存储过程的数据更新途径,而不是将数据库表直接对外公开