浅析Hibernate VO与PO区别

开发 后端
Hibernate PO和Hibernate VO是Hibernate中两个比较关键的概念。首先,何谓VO,很简单,VO就是一个简单的值对象。

Hibernate有很多值得学习的地方,这里我们主要介绍Hibernate,包括介绍Hibernate PO和Hibernate VO方面。

PO(Persistence Object )VO(Value Object  )Hibernate中两个比较关键的概念。
首先,何谓VO,很简单,VO就是一个简单的值对象。

总结:

VO经过Hibernate进行处理,就变成了PO
session.save(user)中,我们把一个VO “user”传递给Hibernate的Session.save方法进行保存。在save方法中,Hibernate对其进行如下处理:

1.在当前session所对应的实体容器(Entity Map)中查询是否存在user对象的引用。

2.如果引用存在,则直接返回user对象id,save过程结束. Hibernate中,针对每个Session有一个实体容器(实际上是一个Map对象), 如果此容器中已经保存了目标对象的引用,那么hibernate会认为此对象已经 与Session相关联。
对于save操作而言,如果对象已经与Session相关联(即已经被加入Session 的实体容器中),则无需进行具体的操作。因为之后的Session.flush过程中,Hibernate会对此实体容器中的对象进行遍历,查找出发生变化的实体,生成
并执行相应的update语句。

3.如果引用不存在,则根据映射关系,执行insert操作。

a) 在我们这里的示例中,采用了native的id生成机制,因此hibernate
从数据库取得insert操作生成的id并赋予user对象的id属性。
b) 将user对象的引用纳入Hibernate的实体容器。
c) save过程结束,返回对象id.
而Session.load方法中,再返回对象之前,Hibernate就已经将此对象纳入其实
体容器中。

Hibernate VO和Hibernate PO的主要区别在于:

◆VO是独立的Java Object。
◆PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实际数据库中。如果一个PO与Session对应的实体容器中分离(如Session关闭后的PO),那么此时,它又会变成一个VO。Hibernate VO和Hibernate PO的概念,又引申出一些系统层次设计方面的问题。如在传统的MVC架构中,位于Model层的PO,是否允许被传递到其他层面。由于PO的更新最终将被映射到实际数据库中,如果PO在其他层面(如View层)发生了变动,那么可能会对Model 层造成意想不到的破坏。

因此,一般而言,应该避免直接PO传递到系统中的其他层面,一种解决办法是,通过一个VO,通过属性复制使其具备与PO相同属性值,并以其为传输媒质(实际上,这个VO被用作Data Transfer Object,即所谓的DTO),将此VO传递给其他层面以实现必须的数据传送。

属性复制可以通过Apache Jakarta Commons Beanutils (http://jakarta.apache.org/commons/beanutils/)组件提供的属性批 量复制功能,避免繁复的get/set操作。

【编辑推荐】

  1. Hibernate入门学习宝典
  2. Hibernate属性简单分析
  3. Struts-Spring-Hibernate案例
  4. Hibernate Sessin接口常用方法
  5. Hibernate事务全面介绍
责任编辑:仲衡 来源: dlog
相关推荐

2022-09-13 08:40:51

DTOVOPO

2011-07-08 16:24:53

VOPO

2017-10-26 14:59:47

MybatisHibernate数据库

2021-03-08 08:54:12

驱动模型DTODO

2009-06-18 11:43:40

Hibernate uHibernate s

2010-02-23 09:33:39

Hibernate批量Hibernate批量

2009-07-17 10:08:39

Hibernate与i

2009-09-28 17:23:51

Hibernate E

2024-11-29 07:34:36

PO持久化对象

2009-07-09 16:01:27

2009-09-22 13:09:06

Hibernateorm框架

2009-09-24 11:41:46

Hibernate延迟

2009-09-21 17:23:49

Hibernate使用

2009-09-22 13:12:25

Hibernateibatis

2009-09-23 10:19:08

Hibernate分页

2009-09-21 18:13:11

Hibernate S

2009-09-23 17:28:55

Hibernate C

2009-09-21 12:50:34

Hibernate架构

2009-09-22 10:23:15

Hibernate配置

2009-09-22 17:32:38

Hibernate A
点赞
收藏

51CTO技术栈公众号