Hibernate基本特性一对象持久化
在Hibernate使用过程中,实体对象可以具有以下三种状态:
a.临时状态
采用new关键字刚创建的对象,该对象未与Session发生关联。
*b.持久状态
实体对象与Session发生关联。例如调用了session的get、load、save、update等方法。
处于持久状态的对象具有以下特点:
--对象生命期持久,垃圾回收器不能回收。(将其切换成游离状态才能回收)
--对象的数据可以与数据库同步,由Session对象负责管理和同步。
--对象在Session的一级缓存中存放
c.游离状态
原来是持久状态,后来不受Session管理了。
缓存状态如何切换?
=======批量操作注意及时清除缓存========
tx = session.beginTransaction();
for(int i=0;i<100000;i++){
Foo foo = new Foo();
//设置foo属性
session.save(foo);
//够50个对象,与数据库同步,并清除缓存
if(i%50==0){
session.flush();//同步
session.clear();//清除缓存
}
}
tx.commit();
=======================================
示例代码:/hibernate01/src/test/TestPer.java
TestPer.java
package test;
import java.sql.Date;
import java.sql.Timestamp;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;
import util.HibernateUtil;
import entity.Foo;
/**
* 测试持久性的三种状态:
* 临时状态、持久状态、游离状态
*/
public class TestPer {
//@Test
public void test1(){
//foo处于临时状态
Foo foo = new Foo();
foo.setName("TEST");
foo.setSalary(6000);
foo.setMarry(true);
foo.setHireDate(
new Date(System.currentTimeMillis()));
foo.setLastLoginTime(
new Timestamp(System.currentTimeMillis()));
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
//foo由临时状态->持久状态
session.save(foo);
//foo由持久状态->游离状态
session.clear();
//下面的修改操作将不能同步到数据库
foo.setName("test");
tx.commit();
session.close();
}
@Test
public void test2(){
Session session = HibernateUtil.openSession();
Transaction tx = session.beginTransaction();
Foo foo = (Foo) session.load(Foo.class,3);
foo.setName("张三");
foo.setSalary(6500);
//由于调用tx.commit();之前会先调用flush(),故可省略
//session.flush();
tx.commit();//内部先调用flush()
session.close();
}
}
当持久对象数据改变后,调用session.flush()方法,会与数据库同步更新。tx.commit()方法,内部也调用了flush(),因此可以省略flush()调用。