`
carrot
  • 浏览: 163044 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

POJO 与 PO的 概念

阅读更多

POJO = pure old java object or plain ordinary java object or what ever.

PO = persisent object 持久对象

就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。全都是这样子的:

public class User { 
  private long id; 
  private String name;
  public void setId(long id) {
 this.id = id;
}  
public void setName(String name) {
this.name=name;
} 
 public long getId() {
 return id;
}  
public String getName() { 
return name;
}
}  

首先要区别持久对象和POJO。

持久对象实际上必须对应数据库中的entity,所以和POJO有所区别。比如说POJO是由new创建,由GC回收。但是持久对象是insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中,Connnection关闭以后,持久对象就不存在了,而POJO只要不被GC回收,总是存在的。

由于存在诸多差别,因此持久对象PO(Persistent Object)在代码上肯定和POJO不同,起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽量和POJO一致,对于程序员来说,他们可以把PO当做POJO来用,而感觉不到PO的存在。

JDO的实现方法是这样的:

1、编写POJO

2、编译POJO

3、使用JDO的一个专门工具,叫做Enhancer,一般是一个命令行程序,手工运行,或者在ant脚本里面运行,对POJO的class文件处理一下,把POJO替换成同名的PO。

4、在运行期运行的实际上是PO,而不是POJO。

该方法有点类似于JSP,JSP也是在编译期被转换成Servlet来运行的,在运行期实际上运行的是Servlet,而不是JSP。

Hibernate的实现方法比较先进:

1、编写POJO

2、编译POJO

3、直接运行,在运行期,由Hibernate的CGLIB动态把POJO转换为PO。

由此可以看出Hibernate是在运行期把POJO的字节码转换为PO的,而JDO是在编译期转换的。一般认为JDO的方式效率会稍高,毕竟是编译期转换嘛。但是Hibernate的作者Gavin King说CGLIB的效率非常之高,运行期的PO的字节码生成速度非常之快,效率损失几乎可以忽略不计。

实际上运行期生成PO的好处非常大,这样对于程序员来说,是无法接触到PO的,PO对他们来说完全透明。可以更加自由的以POJO的概念操纵PO。另外由于是运行期生成PO,所以可以支持增量编译,增量调试。而JDO则无法做到这一点。实际上已经有很多人在抱怨JDO的编译期Enhancer问题了,而据说JBossDO将采用运行期生成PO字节码,而不采用编译期生成PO字节码。

另外一个相关的问题是,不同的JDO产品的Enhancer生成的PO字节码可能会有所不同,可能会影响在JDO产品之间的可移植性,这一点有点类似EJB的可移植性难题。

由这个问题另外引出一个JDO的缺陷。

由于JDO的PO状态管理方式,所以当你在程序里面get/set的时候,实际上不是从PO的实例中取values,而是从JDO State Manager?中取出来,所以一旦PM关闭,PO就不能进行存取了。

在JDO中,也可以通过一些办法使得PO可以在PM外面使用,比如说定义PO是transient的,但是该PO在PM关闭后就没有PO identity了。无法进行跨PM的状态管理。

而Hibernate是从PO实例中取values的,所以即使Session关闭,也一样可以get/set,可以进行跨Session的状态管理。

在分多层的应用中,由于持久层和业务层和web层都是分开的,此时Hibernate的PO完全可以当做一个POJO来用,也就是当做一个VO,在各层间自由传递,而不用去管Session是开还是关。如果你把这个POJO序列化的话,甚至可以用在分布式环境中。(不适合lazy loading的情况)

但是JDO的PO在PM关闭后就不能再用了,所以必须在PM关闭前把PO拷贝一份VO,把VO传递给业务层和web层使用。在非分布式环境中,也可以使用ThreadLocal模式确保PM始终是打开状态,来避免每次必须进行PO到VO的拷贝操作。但是不管怎么说,这总是权宜之计,不如Hibernate的功能强。

分享到:
评论

相关推荐

    关于VO、PO的理解——java的(PO,VO,TO,BO,DAO,POJO)解释

    在 Java 中,PO、VO、TO、BO、DAO、POJO 是六个重要的概念,它们之间存在着紧密的关系,本文将对它们进行详细的解释。 首先,PO(Persistent Object)是持久化对象,它是对象关系映射(O/R Mapping)中的概念,将...

    Java的几种对象(PO-VO-DAO-BO-POJO)解释

    总结来说,PO-VO-DAO-BO-POJO这些概念在Java开发中非常常见,每种类型的对象都有其特定的作用和应用场景。理解这些概念有助于更好地设计系统架构,提高代码的可维护性和扩展性。在实际开发过程中,根据项目的具体...

    Java的(PO,VO,TO,BO,DAO,POJO)解释

    本篇文章将对Java中的PO、VO、TO、BO、DAO、POJO等概念进行详细的解释,帮助读者更好地理解和应用这些技术。 PO(Persistant Object)持久对象 PO是Java中的一种重要概念,表示持久对象。在O/R映射中,PO通常对应...

    JAVA中的POJO、VO、PO、DO、DTO都是什么?有什么区别?

    以下是关于POJO、VO、PO、DO、DTO的详细解释及其区别。 1. POJO(Plain Old Java Object):POJO是一个通用术语,指没有特定框架限制的简单Java对象。它通常包含了业务逻辑和数据属性,不包含任何特定框架的注解或...

    java术语(PO/POJO/VO/BO/DAO/DTO)

    本文将详细解析"PO/POJO/VO/BO/DAO/DTO"这六个概念,并探讨它们在实际项目开发中的作用和应用场景。 1. PO(Persistent Object,持久化对象) PO是指与数据库表结构一一对应的Java对象,它通常包含了数据库表中的...

    hcg.rar_ant hibernate po_pojo code g

    "hcg.rar_ant hibernate po_pojo code g" 提供的资源显然是一个利用Ant构建工具和Hibernate ORM框架,自动生成POJO(Plain Old Java Object)和Hibernate映射文件的过程。下面我们将详细探讨这两个关键概念以及它们...

    java(PO,VO,BO,DAO,POJO)Explained Collection

    Java开发中,PO(Persistant Object)、VO(Value Object)、BO(Business Object)、DAO(Data Access Object)和POJO(Plain Old Java Object)是常见的五个概念,它们在软件设计和开发中扮演着不同的角色。...

    VO / DTO / BO / ORM DAO entity DO PO/ POJO(分层领域模型规约)整理

    通过对VO、DTO、BO、ORM、DAO、Entity、DO、PO 和 POJO 的深入分析,我们可以看出这些概念在不同的层次和场景下发挥着各自的作用。正确地使用这些模型能够帮助开发者更好地组织代码,提高系统的可维护性和扩展性。在...

    po vo dto bo to

    ### Java中的PO、VO、TO、BO、DAO与POJO详解 #### 一、概述 在Java企业级应用开发中,经常会遇到各种类型的对象,如PO、VO、TO、BO、DAO以及POJO等。这些对象各有侧重,在系统架构的不同层次扮演着不同的角色。...

    基于java中的PO VO DAO BO POJO(详解)

    在Java开发中,特别是在企业级应用领域,有几种常见的对象模型,它们分别是PO(Persistent Object)、VO(Value Object)、DAO(Data Access Object)、BO(Business Object)和POJO(Plain Old Java Object)。...

    java中PO、VO、BO、POJO、DAO、DTO、TO、QO、Bean、conn的理解

    在 Java 中,PO、VO、BO、POJO、DAO、DTO、TO、QO 等概念都是 O/R Mapping 中的重要概念。它们之间的关系是:BO 封装业务逻辑,调用 DAO 方法,结合 PO 和 VO 进行业务操作。DAO 中包含了各种数据库的操作方法,通过...

    Javabean与DTO的区别.docx

    POJO的概念出现是为了区别于EJB(Enterprise JavaBeans)等复杂的企业级组件。虽然POJO最初设计时不包含业务逻辑,但在实际应用中,POJO也常被用作轻量级的DTO或VO(Value Object),用于数据传输或表示数据状态。 ...

    java中的缩写

    在Java开发领域,掌握一系列关键概念与缩写是至关重要的,它们构成了软件工程的基础框架,尤其是在处理数据库交互、业务逻辑封装以及数据传输等核心环节。本文将深入解析几个常见的Java名词缩写,包括PO(Persistent...

    IDEA自动生成代码,包括PO层、DAO、SERVICE、SWAGGER注释类

    首先,让我们了解这些概念: 1. **PO层(Plain Old Java Object)**:PO对象通常用于表示数据库中的实体,它不包含任何业务逻辑,仅包含属性和对应的getter/setter方法。 2. **DAO层(Data Access Object)**:DAO...

    Struts、Spring、Hibernate&Ajax;学习笔记总结

    - **POJO 转 PO**:持久化过程中,POJO 通常会被转换为 PO,以便于与数据库交互。 - **POJO 转 DTO**:当需要跨层传输数据时,POJO 可能会被转换为 DTO。 - **POJO 转 VO**:当数据需要展示给用户时,POJO 会被转换...

    MVC设计模式

    #### 四、POJO与JavaBean的概念 ##### JavaBean JavaBean是Java程序中的一种特殊类,主要用于封装数据和业务逻辑。它具备以下几个特点: 1. **公共可访问性**:JavaBean是一个public的类。 2. **默认构造器**:...

    Hibernate数据持久化技术

    而PO(Persistent Object,持久对象)则是一个具有持久化特性的POJO,它通常与数据库表中的一个记录相对应。在Hibernate中,POJOs可以被看作是数据库表的逻辑表示,它们的实例代表了数据库中的行。当使用Hibernate时...

    Hibernate学习心得

    在Hibernate中,持久化对象(Persistent Object,简称PO)是核心概念之一。一个持久化对象通常对应于数据库中的一个表记录,其属性与表的列字段相对应。PO被设计为简单的Java对象(Plain Old Java Object,POJO),...

Global site tag (gtag.js) - Google Analytics