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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章