本文所有例子:连接的MySQL数据库,
基于Book类
private Integer id; //id private String name; //书名 private Double price; //价格
创建session静态方法:
public class HibernateUtils { //声明一个私有的静态final类型的Configuration对象 private static final Configuration config; //声明一个私有的静态final类型的SessionFactory对象 private static final SessionFactory factory; //通过静态代码块构建SessionFactory static { config = new Configuration().configure(); factory = config.buildSessionFactory(); } //提供一个公有的静态方法供外部获取,并返回一个sesison对象 public static Session getSession() { return factory.openSession(); } }
一、持久化对象含义:
Hibernate是持久层的ORM映射框架,专注于数据的持久化工作。所谓的持久化,就是将内存中的数据永久存储到关系型数据库中。
二、Hibernate对象:
1.临时对象(Transient):
在使用代理主键的情况下,
OID通常为null ;
不处于session缓存中;
在数据库中没有对应的记录
2.持久化对象(托管)(Persist):
OID不为null;
位于Session缓存中;
若在数据库中已经有和其对应的记录,持久化对象和数据库中的相关记录对应
Session在flush缓存时,会根据持久化对象的属性变化,来同步更新数据库
在同一个Session实例的缓存中,数据库表中的每条记录只对应唯一的持久化对象
3.游离对象(脱管)(Detached):
OID不为null;
不在处于Session缓存中;
一般情况需下,游离对象是由持久化对象转变过来的,因此在数据库中可能还存在与它对应的记录
三、持久化对象的状态:
瞬时态:此对象是由new命令创建、开辟内存空间的对象,不存在持久化标识0ID,尚未与Hibernate Sess ion关联,在数据库中也没有记录,失去引用后将被JVM回收。
持久态:此对象存在持久化标识0ID,在Session缓存中,并且相关联的Sess ion没有关闭,在数据库中有唯一对应的记录,注意:持久态对象是在事务还未提交前变成持久态的。
托管态:此対象存在持久化棕枳OID,并且仍然与数据庠中的数据存在美朕,只是失去了与当前Session的美朕,脱管状杰対象爰生改変吋Hibernate不能检测到。
// 1.演示持久化对象三种状态 @Test public void test1() { // 1.得到session Session session = HibernateUtils.getSession(); // 2.开启事务 session.beginTransaction(); // 3.操作 Book book = new Book(); // 瞬时态 //为book的id属性赋值后,执行完此步骤后,book对象将由瞬时态转换为脱管态 // book.setId(1); book.setName("thinking in java"); book.setPrice(99d); session.save(book); // 持久化状态(与Session关联并且有OID值) // 4.提交事务 session.getTransaction().commit(); // 5.关闭资源 session.close(); // 脱管(游离)(依然有OID值,但没有与session关联) System.out.println(book); //当程序执行完此处代码后,book对象将由脱管态转换为瞬时态 // book.setId(null); }
session的save()方法:
(1)使一个临时对象转变为持久化对象,
(2)完成以下操作:
选用映射文件指定的标识符生成器,为持久化对象分配唯一的OID
(1)都可以根据跟定的OID从数据库加载一个持久化对象
(2)区别:当数据库中不存在与OID对应的记录时,load()方法抛出ObjectNotFoundException异常,而get() 方法返回null
(3)两者采用不同的延迟检索策略: load方法支持延迟加载策略。而get不支持。
session的update()方法:
(1)Session的update()方法使一一个游离对象转变 为持久化对象,并且计划执行一条update语句.
(2)必若希望Session仅当修改了News对象的属性时,才执行update() 语句,可以把映射文件中<class>元素的select-before-update设为true.
(3)该属性的默认值为false必当update()方法关联-一个游离对象时,如果在数据库中不存在相应的记录,也会抛出异常.
session的saveOrUpdate()方法:
session的delete()方法:
(1)Session的delete() 方法既可以删除-一个游离对象,也可以删除一一个持久化对象
(2)Session的delete()方法处理过程:
计划执行一条delete语句
把对象从Session缓存中删除,该对象进入删除状态.