博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
持久化对象
阅读量:4966 次
发布时间:2019-06-12

本文共 2487 字,大约阅读时间需要 8 分钟。

  

 

1  持久化对象三种状态 

    瞬态:对象由new操作符创建,且尚未与Hibernate Session关联的对象被认为处于瞬态。瞬态对象不会被持久化到数据库中,也不会被赋予持久化标识。如果程序中失去了瞬态对像的引用,瞬态对象将被垃圾回收机制销毁。使用Hibernate Session可以将其变为持久化状态。

    持久化:持久化实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久化的实例可以是刚刚保存的,也可以是刚被加载的。无论哪一种,持久化对象都必须与制定的Hibernate Session关联。Hibernate会检测到处于持久化状态对象的改动,在当前操作完成时将对象数据写回数据库。开发者不需要手动执行UPDATE。

    脱管:某个实例曾经处于持久化状态,但随着与之关联的Session被关闭,该对象就变成托管状态。脱管状态的引用依然有效,对象可继续被修改。如果重新让脱管对象与某个Session关联,这个脱管对象会重新转换为持久化状态,而脱管期间的改动也不会丢失,也可被写入数据库。正是因为这个功能,逻辑上的长事务成为可能,它被称为应用程序事务。即事务可以跨越用户的思考,因为当对象处于脱管状态时,该对象的操作无须锁定数据库,不会造成性能的下降。

          

 

          

2  改变持久化对象状态的方法 

2.1  持久化实体——save & persist

    让瞬态转变为持久化状态,Hibernate Session提供了几个方法:

  • Serializable save(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。
  • Serializable save(Object obj,Object pk):将obj对象保存到数据库,保存到数据库时,指定主键值。
  • void persist(Object obj):将obj对象变为持久化状态,该对象的属性将被保存到数据库。
  • void persist(Object obj,Object pk):将obj对象变为持久化状态,保存到数据库时,指定主键值。

2.2  根据主键加载持久化实体——load

    也可以通过load()方法来加载一个持久化实例,根据持久化类的标识属性值加载持久化实例----其实质是从数据库表加载一条新记录。代码如下:

News n = sess.load(News.class,New Integer(pk));

    注意:如果没有匹配的数据库记录,load()方法可能抛出HibernateException异常;如果在类映射文件(xxx.hbm.xml)中指定了延迟加载(lazy),则load()方法将会返回一个未初始化的代理对象,这个代理对象并没有装载数据记录,直到程序调用该代理对象的某方法时,Hibernate才会去访问数据库。

    load()方法和get()方法主要区别在于是否延迟加载:

    ① 使用load()方法具有延迟加载功能,load()方法不会立即访问数据库,当试图加载的记录不存在时,load()方法返回一个未初始化的代理对象;

    ② get()方法总是立即访问数据库,当试图加载的记录不存在时,get()方法将直接返回null。

2.3  更新游离状态的实体——update & updateOrSave

    对于一个曾经持久化的对象,但已经脱离了session的管理的脱管对象,Hibernate提供了update()、merge()、updateOrSave()等方法来保存这些修改。

    ① update(),使用该方法后脱管对象再次回到session 的管理下,变为持久化状态;

    ② updateOrSave()方法,如果不清楚对象是否曾经被持久化过,使用此方法可以自动判断,如果持久化过则update,没有则save;

    ③ lock()方法也可以将某个对象重新持久化,但该脱管对象必须是没有修改过的,代码如下:

//简单重新持久化session.lock(news , LockMode.NONE);//先检查持久化对象的版本,然后重新持久化对象session.lock(news , LockMode.READ);//先检查持久化对象的版本,然后使用SELECT...FOR UPDATE重新持久话对象session.lock(news , LockMode.PESSIMISTIC_WRITE);

2.4 删除持久化实体——delete

如果传入的参数是持久化对象,Session就计划执行一个delete语句;如果传入的参数是游离对象,先使游离对象被Session关联,使它变为持久化对象,然后计划执行一个delete语句。一旦删除该持久化对象,对应的数据库记录也将被删除。

session.delete(n);

 

3  持久化操作的步骤

//② 创建Configuration对象,默认加载hibernate.cfg.xml文件。

Configuration conf=new Configuration().configure();
//③ 以Configuration对象创建SessionFactory对象的实例,它是产生Session对象实例的工厂,在整个应用中应该是唯一的。
SessionFactory sf=conf.buildSessionFactory();
//④ 创建Session对象,打开session(相当于JDBC获得数据库的连接)
Session session=sf.openSession();
//⑤ 开始事务
Transaction tx=session.beginTransaction();
//⑥ 持久化操作(增删改必须,查可选)
session.save(user);
//⑦ 提交事务
tx.commit();
//⑧ 关闭session,释放数据库的链接
session.close();

转载于:https://www.cnblogs.com/jianxin-lilang/p/6564239.html

你可能感兴趣的文章
Centos7 系统更改apache默认网站目录(解决You don't have permission to access / on this server问题)...
查看>>
Centos7 安装python环境
查看>>
修改apt,pip,npm为国内镜像源
查看>>
python 虚拟环境安装
查看>>
python 实现多层列表拆分成单层列表
查看>>
欢迎页面
查看>>
sqlserver cdc实现数据增量抽取
查看>>
论分治与归并思想
查看>>
关于缩短cin时间的方法
查看>>
Romantic HDU - 2669(扩欧模板题)
查看>>
素数筛法(Eratosthenes筛法)
查看>>
Security Guards (Gym - 101954B)( bfs + 打表 )
查看>>
Arranging Your Team HDU - 3720 【DFS】
查看>>
UVA - 1152 --- 4 Values whose Sum is 0(二分)
查看>>
【I'm Telling the Truth】【HDU - 3729】 【匈牙利算法,DFS】
查看>>
整除分块思想
查看>>
【Isabella Message】 【SPOJ - ISAB】【HDU-4119】【模拟】【矩阵的旋转】
查看>>
【畅通工程 HDU - 1232 】【并查集模板题】
查看>>
【统计难题】【HDU - 1251】【map打表或字典树】【字典树模板】
查看>>
【还是畅通工程 HDU - 1233】【Kruskal模板题】
查看>>