瞬时(transient):数据库中没有数据与之对应,超过作用域会被jvm垃圾回收器回收,一般是new出来且与session没有关联的对象。
持久(persistent):数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
脱管(detached):数据库中有数据与之对应,但当前没有session与之关联,脱管对象状态发生改变,hibernate不能检测到。
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.shizhan.hibernate.domain.UserBean;
import com.shizhan.util.HibernateUtil;
public class TestHibernate {
public static void main(String[] args) {
//我们刚创建了一个对象,数据库中没有记录相关联,是瞬时状态
UserBean user = new UserBean();
user.setUsername("shizhan");
user.setPassword("123");
//当我们调用了添加之后,数据库有记录与user关联了,可是session关闭了,这时候user的状态为脱管的
add(user);
UserBean u = get(1);
System.out.println(u);
}
public static void add(UserBean user)
{
Session s =null;
try{
s = HibernateUtil.getSession();
Transaction t = s.beginTransaction();
//保存user之后,数据库中有和他相关的记录,且session没有关闭,他属于持久状态
s.save(user);
//Hibernate: update UserBean set username=?, password=? where id=?
//hibernate会优化我们的更新操作,可以看到两个set操作,他只执行了一个update语句,他更新的时机是在
//事务提交之前的一小会
user.setUsername("heii");
user.setPassword("heii");
t.commit();
}finally{
s.close();
}
}
public static UserBean get( int id)
{
Session s =null;
UserBean u =null;
try{
s= HibernateUtil.getSession();
u = (UserBean) s.get(UserBean.class,id);
}finally{
if(s!=null)
{
s.close();
}
}
return u ;
}
}