Hibernate对象的状态有以下四种:
1)瞬时状态
也就是实体对象处于new的状态。它是在session缓存区中不存在的,也不会跟session有关联,更不会跟数据库有关联
2)持久状态
持久状态最重要的。当你用save(),load(),get(),update(),list,iterater,scroll,saveOrUpdate方法时,都会变成持久状态,会把对象放在session缓存区中。当session进行缓存区清理的时候,也就是commit的时候,会把数据与数据库进行同步。
3)移除状态
用remove(),delete就会从持久状态变成移除状态,移除状态的对象还是存在缓存区中的,只是数据库中不再有此对象,不再和它关联,一旦session关闭,这个对象也就没有意义了
4)游离状态
当session关闭后,存在session缓存区中的对象就变成了游离状态 。他们还是可以访问各自的数据,但是他们不在和数据库关联起来, 他们只是曾经与session有过联系,而最后被抛弃的东西, 而他们拥有对象标识符。
这里介绍第一种Session提供的方法,其中增、删、改都是根据id来进行操作的。
一、增:save方法:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction ts = session.getTransaction();
ts.begin();
try {
Student student = new Student();
student.setId(3);// 已设为自动增长序列,手动指定被忽略
student.setName("李四");
student.setSex("男");
session.save(student);
ts.commit();
} catch (Exception e) {
ts.rollback();
} finally {
session.close();
}
需要注意的是,如果已设置了主键生成策略,那么手动指定主键值会被忽略。
二、改 update方法:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction ts = session.getTransaction();
ts.begin();
try {
Student student = new Student();
student.setId(25);// 已设为自动增长序列,手动指定被忽略
student.setName("李四1");
student.setSex("女");
session.update(student);
ts.commit();
} catch (Exception e) {
ts.rollback();
} finally {
session.close();
}
注意,若直接对持久化状态的对象(即在数据库中已经存在)进行修改,当事务提交的时候,若系统检测到和数据库中的不一样,会自动发起update语句。如下面的和上面效果是一样的:
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction ts = session.getTransaction();
ts.begin();
try {
Student student = (Student) session.get(Student.class, 24);
//student.setId(24);// 已设为自动增长序列,手动指定被忽略
student.setName("李四");
student.setSex("男");
//session.update(student);
ts.commit();
} catch (Exception e) {
ts.rollback();
} finally {
session.close();
}
注:saveOrUpdate()方法:增或改,判断id是否存在,存在则改,不存在则增。
1、如果id已配置主键生成策略,判断id是否指定,指定则是更新,否则为插入;
2、如何id不是自动生成而是人工指定,判断id是否在数据库中存在,存在则为update,否则为save。
三、删 delete方法:
是根据id来删除的,如
Student student = new Student();
student.setName("李四");
session.delete(student);
ts.commit();
是删不掉的,必须有明确的id。
四、查 get方法
load方法和get方法非常相似,不同在于,查不到的话。get会返回null,而load会抛出异常。