添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
注册/登录

浅析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操作。

【编辑推荐】

  • Hibernate入门学习宝典
  • Hibernate属性简单分析
  • Struts-Spring-Hibernate案例
  • Hibernate Sessin接口常用方法
  • Hibernate事务全面介绍
  • 责任编辑:仲衡 dlog
    点赞
    收藏