Hibernate的一级缓存时间很短,其生命周期和session的一样,所以一级缓存也称session级缓存或事务级缓存。
在Hibernate中的get()方法和load()方法都是支持一级缓存的,而iterate()方法只有在查询实体对象时才支持一级缓存。
在Hibernate中可以使用session.clear()或session.evict()对一级缓存进行管理。
如果在使用中,所需操作的数据量特别大,需要考虑直接采用JDBC实现。
当一个实体对象new完之后,它就是一个Transient状态。而一个处于Transient状态的对象随时都会被垃圾回收器回收掉。
当对Transient状态的对象执行了save()或update()之后,这个对象就会变为Persistent状态,当Persistent状态的对象再被执行evict()或close()或clear()之后,它就会变为Detached状态。而Detached状态的对象也会随时被垃圾回收器回收掉。
当Persistent状态的对象被执行了delete()时,其状态则会转为Transient状态。为什么呢?因为此时数据库中已经没有与之对应都记录了,而仅仅是内存中的一个对象,且没有被引用。
当Detached状态都对象被执行了update()时,其状态则会转为Persistent状态。这又是为什么呢?因为数据库中存在与之对应都记录,此时它就又被session所管理来。
上面都描述是不是感觉有点晕呢?那就看看下面这张图吧,这样应该会更清晰。

那么,说来说去,看来看去,我们又该如何去区分这三种状态呢?很简单,记住下面三条即可。
1.Transient状态的对象是我们刚刚new出来的,尚未被引用,且数据库中不存在与之对应的记录。
2.Persistent状态的对象则是由session来管理的,且数据库中存在与之对应的记录。
3.Detached状态的对象是已经被session抛弃的对象(因为已经执行了evict/close/clear),且数据库中存在与之对应的记录。
之前我以为Hibernate的映射文件只能自己手工写,可是如果表很多,每个表又有N个字段呢?那我岂不是要吐血了?今天发现原来这个东西也可以通过MyEclipse进行生成的!
在MyEclipse工作区右上角选择进入MyEclipse Database Explorer透视图。在DB Browser视图中,逐次展开节点,右键选中需要映射的表,在弹出的菜单中选择“Hibernate Reverse Engineering”在弹出的对话框中选择生成实体类和映射文件的包名。选中“Hibernate mapping file”复选框,选中“Java Data Object”复选框。然后单击“Next”按钮。
在“Configure type mapping details”对话框中,ID Generator选择“native”,继续“Next”。
在“Config reverse engineering details”中,保持所有复选框都未选中,单击“Finish”按钮。
这时就开始生成实体类和映射文件了,完成后,返回到Java透视图,即可看到已经生成了实体类和映射文件了。
手工配置Hibernate的数据连接参数是不是感觉很累呢?在实际开发中使用MyEclipse工具给项目添加Hibernate支持,自动添加了Hibernate配置文件。
使用MyEclipse Hibernate Config Editor打开Hibernate配置文件,单击DB Driver旁边的“New…”按钮,用向导配置数据库连接信息。
在弹出的Database Drive对话框中,Driver template根据自己的需求选择,Driver name可以随便起名,Connection URL一定要填写正确,Driver JARs中添加数据库的驱动JAR包,怕出错的话可以点击“Test Dirver”测试一下,单击“下一步”按钮。
在Schema Details对话框中,选择正确的数据库,单击“完成”按钮。MyEclipse就会自动在Hibernate配置文件中配置好数据库的相关参数。
程序运行的时候,有些程序数据包存在内存中,当程序退出后,这些数据就不复存在了,所以,我们称这些数据的状态为瞬时的(Transient)。有些数据,在程序退出后,还以文件等形式保存在存储设备中,我们称这些数据的状态是持久的(Persistent)。
持久化是将程序中数据在瞬时状态和持久状态间转换的机制。
JDBC就是一种持久化机制。将程序数据直接保存成文本文件也是持久化机制的一种实现。但我们常用的是将程序数据保存到数据库中。
在三层结构中,DAO层有时候也称为持久化层,如下图所示。因为这一层承担的主要工作就是将数据保存到数据库中或把数据从数据库中读取出来。
