一、配置Hibernate运行环境
这里我们使用Myeclipse 10自带的Hibernate支持配置环境
1.首先你需要创建数据连接(DB Driver)
配置的是oracle数据连接
2.右键项目选择 Myeclipse –>Add Hibernate Capabilities…
3.后续根据个人选择即可
会自动生成Hibernate环境和生成核心配置文件 以及 Hibernate的工具类HibernateSessionFactory
配置文件
<hibernate-configuration>
<session-factory>
<!-- 配置连接数据库的基本配置 -->
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="connection.username">bajie</property>
<property name="connection.password">556556</property>
<propertyname="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
<!-- 是否显示sql语句 -->
<property name="show_sql">true</property>
<!-- 是否格式化显示sql语句 -->
<property name="format_sql">true</property>
<!-- 引入orm映射文件 -->
<mapping resource="entiy/Users.hbm.xml" />
</session-factory>
HibernateSessionFactory工具类
最常用的方法
public class HibernateSessionFactory {
/**
* 保存线程变量,该变量只保存一个值,不同的线程保存各自的值
*/
private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
private static org.hibernate.SessionFactory sessionFactory;
private static Configuration configuration = new Configuration();
//配置文件的路径
private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
private static String configFile = CONFIG_FILE_LOCATION;
//获取session
//一次请求是一个线程,session是储存在threadLocal中
public static Session getSession() throws HibernateException {
//从本次线程中获取session
Session session = (Session) threadLocal.get();
//如果session为空或者 session未有开启--->在本线程从新获取session
if (session == null || !session.isOpen()) {
//如果sessionFactory 为空 那么从新创建一个sessionFactory
if (sessionFactory == null) {
rebuildSessionFactory();
}
//进行获取session 的处理
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
//把这次从新获取到的session 写入线程
threadLocal.set(session);
}
return session;
}
}
映射文件District.hbm.xml
<hibernate-mapping>
<!-- name对应的实体类 table对应数据库表 schema数据库管理员-->
<class name="entiy.District" table="DISTRICT" schema="BAJIE">
<!-- id表示主键 property属性 name对应实体类的属性 type是对应java的数据类型 -->
<!-- column 对应表的哪一个列 -->
<id name="id" type="java.lang.Integer">
<column name="ID" precision="4" scale="0" />
<!-- 主键生成策略 -->
<generator class="increment" />
</id>
<property name="name" type="java.lang.String">
<column name="NAME" length="100" not-null="true" />
</property>
<!-- Hibernate的一对多的映射关系 -->
<set name="streets" inverse="true" cascade="all" >
<key>
<column name="DISTRICT_ID" precision="4" scale="0" />
</key>
<one-to-many class="entiy.Street" />
</set>
</class>
</hibernate-mapping>
二、Java对象的三种状态
Hibernate 通过session管理Java对象 的状态,持久态是一个很重要的状态,持久状态的对象才会进行脏检查
1. 瞬时状态 : Java对象和数据库中的数据没有任何的关联 ( 依据OID–对象标识符来判断 ),此时Java对象的状态为瞬时状态 .
2. 持久状态 : 当对象与Session关联(oid) ,被session管理时,处于持久态; 持久态的对象拥有数据库标识(数据库中的主键) .
3. 游离状态 : 处于持久态的对象,脱离与其关联的session管理后, 对象处于游离状态 .
脏检查:session具有一个缓存,可以管理和跟踪所有持久化对象
1 . 快照: 当持久态对象被 session管理时, session会为对象的值类型的属性复制一份快照
2 . 脏对象: 当session管理的过程中, 对象的属性值发生改变, session执行检查时(脏检查),发现对象的当前属性和快照的属性不同, 那么当前对象会变成脏对象
3 . 提交: 当session 缓存中对象的属性发生变化时,并不会立即进行脏检查和执行 相对应的SQL语句, 而是在特定的时间点才会执行;
4 . 执行时机: 在默认情况下, session会在以下时间点属性缓存,执行脏检查–>发现脏对象的话,执行对应的SQL 语句
1.) :应用程序显式调用 Session的flush() 方法时.
2.) :应用程序调用 Transaction()的commit() 方法时.—>即提交事务时