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);
时间: 2024-10-18 12:53:40

hibernate 深入理解持久化对象的相关文章

hibernate学习之持久化对象

Hibernate对其持久化对象实现了缓存管理,来提高系统性能,Hibernate支持两级缓存管理,一级缓存 是由Session提供的,因此它只存在于Session的生命周期中,是Session所内置的,不能被卸载. Hibernate的二级缓存是由SessionFactory提供的,他作为一个可插入的组件使用的,默认是不支持的,应用必须明确配置二级缓存才能使用. Session缓存的作用: 降低数据库的访问频率 保证缓存中的对象与数据库中的相关记录保持同步持久化对象的状态: 临时状态(Tran

Hibernate笔记——2.深入理解持久化对象

持久化类的要求 Hibernate对于持久化类的要求非常少. 它需要提供一个无参数的构造器,以便hibernate能够创建持久化实例.至少应该是包可见的. 提供一个标识属性,一般为数据库表的主键字段. 每个成员变量需要有set与get方法. 是非final类,以便Hibernate能够生成代理. 重写equals和hashCode方法:如果需要把持久化类放入Set中需要重写. 持久化类的状态 瞬态:对象被new出来但尚未与session关联.瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识

Hibernate持久化对象的三种状态

在Hibernate中,持久化对象在被操作的过程中可以分为三个时期,这三个时期是和Session的周期相关的,因为Hibernate中的操作都是基于Session完成的.Session的特定方法能使对象从一个状态转换到另一个状态. 持久化对象的生命周期有三种,瞬时状态.持久状态和分离状态.如下图: 瞬时态 不曾进行持久化,未与任何Session相关联.此状态的对象是用new关键字创建出来的,此时对象没有和数据库中记录对应. //Transient状态 Useruser = new User();

[原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

【Hibernate步步为营】--核心对象+持久对象全析(二)

上篇文章讨论了Hibernate的核心对象,在开发过程中经常用到的有JTA.SessionFactory.Session.JDBC,其中SessionFactory可以看做数据库的镜像,使用它能够创建Session对象,JTA用来管理事务,在对象模型修改后同步到数据库中,另外还有Hibernate作为持久层它封装了持久层的转化过程,下面着重讨论持久对象的转换过程. 一.状态解析 Hibernate的持久对象主要分为三个状态,Transient.Persistent.Detached,其中Tran

hibernate载入持久化对象的两种方式——get、load

一.get与load对照 在hibernate中get和load方法是依据id取得持久化对象的两种方法.但在实际使用的过程中总会把两者混淆,不知道什么情况下使用get好,什么时候使用load方法效率更高.下边具体说一下get和load的不同,有些时候为了对照也会把find加进来. 1.从返回结果上对照: load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常 get方法检索不到的话会返回null 2.从检索运行机制上对照: get方法和fin

Hibernate持久化对象状态

在Hibernate中,持久化对象再被操作过程中分为三个时期.这三个时期和session周期相关. 分别是瞬时(Transient),持久太(persistent)和游离态(Detached) 瞬时状态 由new命令开辟内存的java对象.例如:Student stu= newStudent();若没有变量对他引用,则被jvm回收.瞬时对象在内存中孤立存在,他的意义仅是携带信息的载体,不和数据库中的数据有任何的关联.通过session的save()和saveOrUpdate()方法可以把一个瞬时

hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据.已经持久化,添?到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Session缓

2.一起来学hibernate之配置文件1与持久化对象

学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作! hibernate的配置文件,总体来说分为两个部分: 1.主配置文件hibernate.cfg.xml文件,一般放在classpatn路径下 2.映射文件xxx.hbm.xml文件,一般跟实体类放在同一个包下 前者是配置相关的数据库以及引入的映射文件信息,而后者则主要配置对象与表之间的映射关系: 注意:配置文件的路径,因人而异,有的将映射文件集体放置在一起也有,所以看个人喜好,没有强制规定如何存放. 以