Configuration对象
Configuration相当于hibernate中的商务局,如果你想做什么商业活动的话,必须要到他那注册,接受他的管理.
1. 创建Configuration对象
创建Configuration对象根据Hibernate所使用的配置文件的不同,创建Configuration对象的方式也不相同。
1. 使用Hibernate.properties文件作为配置文件
Configuration cfg = new Configuration()
.addResource("Person.hbm.xml")
.addResource("Name.hbm.xml")
................
.................
.................
.addResource("Time.hbm.xml"<想要操作的类的配置文件,可以1个也可以多个>);
当然还有另一种方法
Configuration cfg = new Configuration()
.addResource("pojo.Person.class")
.addResource("pojo.Name.class")
................
.................
.................
.addResource("pojo.Time.class"<想要操作的类,可以1个也可以多个>);
如果使用上面的方法,那么累的配置文件必须和该类在同一个包内
注意:不常使用
2. 使用hibernate.cfg.xml文件作为配置文件
Configuration cfg = new Configuration().configure();
注意:几乎所有的项目都使用它
3. 不需要任何配置文件创建Configuration
Configuration cfg = new Configuration()
.addClass("pojo.Person.class")//添加持久化类
.addClass("pojo.Name.class")
//通过setProperty设置Hibernate的连接属性
.setProperty("hibernate.dialect","org.hiberanet.dialect.MySQLInnoDBDialect")
.setProperty("hibernate.connection.datasource","java:comp/en/database/test")
.setProperty("hibernate.order_updates","true");
注意:该种方法不建议使用,这里就不详细解释了。大家了解知道有这么一回事就 行了。
Hibernate.cfg.xml文件了解
文件中的内容是其他持久化类公有的内容
比如连接数据库
1. JDBC连接属性介绍
所有的hibernate属性名字和语义都在org.hibernate.cfg.Environment中定义,感兴趣可以自己看看
JDBC连接的重要配置如下:
hibernate.connection.driver_class:设置连接数据库的驱动程序
hibernate.connection.url:设置连接所需数据库服务的url
hibernate.connection.username:设置连接数据库的用户名
hibernate.connection.password:设置连接数据库的密码
hibernate.connection.pool_size:设置数据库的连接池数量
hibernate.dialect:设置数据库的方言
在hiberante.cfg.xml文件中的写法
<? 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" >
<!-- 上面的是限制本文件的DTD -->
< hibernate-configuration > <!-- 根元素 -->
< session-factory > <!-- 数据连接 -->
< property name = "connection.username" >
Scott <!-- 设置数据库用户名 -->
</ property >
< property name = "connection.url" >
jdbc:oracle:thin:@127.0.0.1:1521:liang
<!-- 设置数据库服务url -->
</ property >
< property name = "dialect" >
org.hibernate.dialect.Oracle9Dialect
<!-- oracle数据库方言 -->
</ property >
< property name = "myeclipse.connection.profile" >
Orale <!-- myeclipse 工具连接使用 -->
</ property >
< property name = "connection.password" >
Tiger <!-- 数据库密码 -->
</ property >
< property name = "connection.driver_class" >
oracle.jdbc.driver.OracleDriver
<!-- oracle驱动程序 -->
</ property >
< property name = "connection.pool_size" >
30 <!-- 数据库连接池,的连接个数 -->
</ property >
</ session-factory >
</ hibernate-configuration >
注意:在现实的项目中我们极少使用
< property name = "connection.pool_size" >
30 <!-- 数据库连接池,的连接个数 -->
</ property >
他来配置数据库的连接池,通常使用的是C3P0或Proxool连接池。我们常用的是 C3P0.
下面是用来替换 < property name = "connection.pool_size" >
30 <!-- 数据库连接池,的连接个数 -->
</ property >
该属性的
< property name = "hibernate.c3p0.max_size" >
30 <!-- 数据连接池的最大连接数 -->
</ property >
< property name = "hibernate.c3p0.min_size" >
1 <!-- 数据库的最小连接数 -->
</ property >
< property name = "hibernate.c3p0.timeout" >
1000 <!-- 数据库连接池的连接超时时长 -->
</ property >
< property name = "hibernate.c3p0.max_statements" >
100 <!-- 缓存statements的数量 -->
</ property >
其他常用配置
Hibernate.show_sql:
true显示输出hibernate生成的SQL语句
False不显示输出hibernate生成的SQl
Hibernate.jdbc.fetch_size:
制定觉得不错抓取的数量的大小,他可以接受一个整数值,其实质是调用 Statement.setFetchSize()方法
Hibernate.jdbc.batch_size:
制定hibernate使用jdbc2批量更新的大小,他可接受一个整数值,建议 5---30之间的值
Hibernate.hbm2ddl.auto:
设置创建SessionFactory是,是否根据映射文件自动建立数据库表。如果 使用create_drop值显式关闭SessionFactory时,将关闭Drop刚建的 数据表,该属性可以为update、create和create-drop3个值
简单的持久化对象
Hibernate是一个彻底的ORM框架,即一个pojo类-----对应一个Xml的配置文件-------数据库。持久化对象就是把这个pojo实例存入数据库
l 持久化类的要求
1. 持久化类的所有属性必须提供setter和getter方法
2. 需要提供一个无参数的构造器。(hibernate框架可以使用 Constructor.newInstance()方法来创建持久化类)
3. 要有一个标识属性。如id什么的。对应的是数据库中的关键字
4. 重写equals()方法和hashCode()方法。(如果需要把持久化类的实力放入 Set中<当表示多值关联关系映射时,推荐这么做>),则应该为该持久化类重 写equals()方法和hashCode()方法。(详细内容看core Java方面的 图书)。
5. 使用非final的类(在运行时方便hibernate生成代理)
l 持久化对象的状态
1. 瞬态(入境)
2. 持久化(得到永久居留权)
3. 脱管(驱逐出境)
简单解释一下
瞬态(和session没有任何关系)
描述:对象是有new操作符创建,切尚未与hibernate中的session 关联的对象被认为是处于瞬态的状态。
特征:瞬态对象不会持久化到数据库中,也不会被赋予持久化标识(上面 说道的id),如果程序中失去了瞬态对象的引用,瞬态对象将被垃圾
回收
解释:好比我们出国旅游,手中的护照和签证时对我们身份的唯一标识, 也就是上面说的引用。我们在该国没有永久居住权,签证过期我们就 会被立刻驱逐出境。现在的这种状态就叫做瞬态
持久化(和session有关系)
描述:持久化实例在数据库中有对应的记录,并拥有一个持久化的标识。 持久化的实力可以是刚刚保存的,也可以是刚刚被加载的。无论哪一 种,持久化对象都必须与制定的hibernate session关联。
特征:在数据库中存在该条记录,该对象的标识有一个唯一的值
解释:就是你已经有了该国的永久居留权,在他们国家有了一个唯一标识 身份的身份证号
脱管
描述:某个实例曾经处于持久化状态,但随着与之相关联的session被 关闭,该对象就变成脱管状态。
特征:没有与该实例相关的session
该对象依然可以使用
解释:该国家认为你已经犯罪了。Session把你驱逐出境了。但是你的 资料还是有备份存在该国的(数据库中),如果你改过自新,在找一 个session你还是一个持久化的状态
l 改变持久化状态
1. 瞬态-------持久化状态(注意:是new出来的)
可以使用save()和saveOrUpdate()两种方法
解释:
Save()数据库中没有你的时候,使用
saveOrUpdate()数据库中没有你他操作的动作和save()相同,当你 已经存在的时候他会更新你的信息。
持久化状态----瞬态
可以使用delete()方法
2. 持久化状态
数据库-----持久化状态
可使用get()、loaded()、find()和iterator()四种方法
这四种方法都是从数据库中读取出该对象
注意:
注意在使用get和load方法他们之间的不同
Load()方法:具有延迟加载的特性。在使用load方法加载数据库中的 记录时如果该记录不存在会返回一个objectnotfondexception的异 常,get方法没有延迟加载的特性。使用get加载时数据库中如果没有 改纪录就会返回一个null(不会抛出异常)
脱管---持久化状态
可以使用save()、saveOrUpdate()和lock()方法
3. 脱管状态
持久化状态---脱管
使用eviction()、close()和clear()方法