hibernate实体对象一共有三种状态(标准为是否在数据库中有数据以及和session是否有关联)
1. 瞬时对象 (transient) 数据库没有数据与之对应,并且与session也无关联
2.持久化对象 (persistent) 数据库有相对应的数据,并且与当前的session有关联,hibernate能够检测到对象的改变
3.脱管对象 (detached) 数据库已经存在数据,但是与当前的session无关联
(1)下面的两个图片详细说明了这三种对象状态之间的联系
第二个图片显示一般是对脱管对象调用update()方法;这个时候session没有与之对应保存一般是对瞬时对象当不知道对象是瞬时还是脱管的时候,saveorupdate()方法就适用了。
(2)以下代码分别说明了三种对象的不同存在情况
<!-------------------------主函数,用于创建和调用方法---------------------------------------->
public static void main(String[] args) {
Event event = new Event();
event.setTitle("apple");
event.setDate("10.02");
// 这里的event对象的状态就是瞬间对象,数据库中不存在数据,与session也无关联
System.out.println(event.getDate());
//------------------------//
addEvent(event);
//这里的event对象为脱管状态,数据库中存在对应的数据,session与之无关联
System.out.println(event.getDate());
}
<!-----------------用于添加数据到数据库中------------------------------------------------------>
static void addEvent(Event event) {
Session session = null;
Transaction transaction = null;
try {
session = hibernateUtil.getSession();
// 开启事务
transaction = session.beginTransaction();
// 保存数据
session.save(event);
//这个时候的对象是持久化状态
system.out.println(event.getdate());
event.setdate(*111*); //会在数据库产生一个update语句
// 提交
transaction.commit();
} catch (HibernateException e) {
if (transaction != null)
transaction.rollback();
// 必须要处理异常
throw e;
} finally {
// 关闭
if (session != null)
session.close();
}
}
<!------------------------hibernate 的工具类,返回一个session对象------------------------------------->
/**
* 将类设置为final类型,不允许别人继承
*
* @author hugenshen
*
*/
public final class hibernateUtil {
private static SessionFactory sessionFactory;
private hibernateUtil() {
}
static {
Configuration cfg = new Configuration();
//加载配置文件 默认名字为hibernate.cfg.xml 可以进去看源码
cfg.configure();
sessionFactory = cfg.buildSessionFactory();
}
//获取session的方法
public static Session getSession() {
return sessionFactory.openSession();
}
}