Hibernate VO 与 PO

PO即 Persistence Object
VO即 Value Object
POVOHibernate中两个比较关键的概念。
首先,何谓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就已经将此对象纳入其实
体容器中。
VOPO的主要区别在于:
VO是独立的Java Object。
PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数
据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实
际数据库中。
如果一个PO与Session对应的实体容器中分离(如Session关闭后的PO),那么
此时,它又会变成一个VO
POVO的概念,又引申出一些系统层次设计方面的问题。如在传统的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. TUser user = new TUser();   
  2. TUser anotherUser = new TUser();   
  3. user.setName("Emma");   
  4. user.setUserType(1);   
  5. try {   
  6. BeanUtils.copyProperties(anotherUser,user);   
  7. System.out.println("UserName => "  
  8. +anotherUser.getName()   
  9. );   
  10. System.out.println("UserType => "  
  11. + anotherUser.getUserType()   
  12. );   
  13.  
  14. catch (IllegalAccessException e) {   
  15. e.printStackTrace();   
  16. catch (InvocationTargetException e) {   
  17. e.printStackTrace();   

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值