hibernate 完全采用面向对象的方式来操作数据库,因此开发者眼里只有对象、属性,无须理会数据库、表、列等概念。
持久化类的要求
Hibernate 采用低侵入式设计,所以对持久化类的要求也是只要是简单的pojo即可。
虽然hibernate对持久化没什么要求,但应遵守如下规则:
-提供一个无参的构造器,这样hibernate就可以使用Constructor.newInstance()来创建持久化实例了。
-提供 一个标识属性,通常是映射数据库的主键字段
-对象的属性应尽量避免使用最基本的类型,如int 采用integer代替。
-为持久化类的每个成员变量提供getter和setter方法。
-使用非final的类,在运行时生成代理是Hibernate的一个重要功能
-重写equals和hashcode方法,如果需要把持久化类放入set中。
持久化对象的状态
瞬态:对象由new操作符创建,且尚未与hibernate Session关联的对象被 认为处于瞬态。
持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识identifier。在当前操作执行完成时将对象 数据写回数据库。开发者不需要手动执行update
脱管:某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象将变成持久化状态
改变持久化对象状态的方法
-Serializable save(object obj)将对象变为持久化状态
-void persist(object obj)将对象转化为持久化状态
-Serializable save(object obj,object pk)将obj对象转化为持久化状态,该对象保存到数据库,指定主键值
-void persist(object obj,object pk) 也加了一个设定主键
save和persist方法的区别:使用save保存持久化对象时会返回 该 持久化对象的标识属性值。这就可以用到下面的方法中
根据主键加载持久化实体
News n=sess.load(News.class,pk);
如果没有匹配的数据库记录会抛出hibernateExpetion异常,如果在持久化类注解中指定了延迟加载,则load方法会返回 一个未初始化的代码对象,但它并没有加载数据 ,直到程序调用该对象的某个方法里。hibernate才会访问数据库
与load方法类似的是get方法,区别 就是get方法会立刻访问数据库,如果没有对应的记录,get方法会返回 Null,而不是返回一个代理对象。
更新持久化实体
u.setUserName("123123123123");
sess.flush();
更新托管实体
对于一个曾经持久化过,但已经了session管理 的持久化对象,被认为处于脱管状态,此时程序应该显式的使用新的Session来保存修改。hibernate提供了三个方法update merge saveorupdate
当需要使用Update方法来更新修改时,如果不记得该对象是否持久化过,可以使用saveorupdate方法,如果持久化过会使用upate方法,否则是save方法。
merge方法与update方法功能相同 ,区别执行sess.merge(a)方法后,a对象不是持久化对象的状态。而Update会把a变成持久化对象。
Session sess = sf.openSession();
org.hibernate.Transaction tx = sess.beginTransaction();
User u=(User) sess.load(User.class, 2);
System.out.println(u.getUserName());
tx.commit();
sess.close();
Session sess2 = sf.openSession();
org.hibernate.Transaction tx2 = sess2.beginTransaction();
u.setUserName("15701602887");
sess2.saveOrUpdate(u);
tx2.commit();
sf.close();
删除持久化实体
直接使用
sess2.delete(u);