hibernate 深入理解持久化对象

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);

便觉不过如此。也许我们只是想让自己的心去旅行,

hibernate 深入理解持久化对象

相关文章:

你感兴趣的文章:

标签云: