社区
Java EE
帖子详情
po,bo,jo,lo,VO什么的,我怎么都有些混啦,那位能给偶个头绪吗?(不够在加分)
hellboys
2005-04-15 01:02:06
po,bo,jo,lo,VO什么的,我怎么都有些混啦,那位能给偶个头绪吗?(不够在加分)
...全文
463
5
打赏
收藏
po,bo,jo,lo,VO什么的,我怎么都有些混啦,那位能给偶个头绪吗?(不够在加分)
po,bo,jo,lo,VO什么的,我怎么都有些混啦,那位能给偶个头绪吗?(不够在加分)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
yeshucheng
2005-04-15
打赏
举报
回复
这里面有些是关于hibernate里的概念,楼主可以去翻翻这方面的书看看
hellboys
2005-04-15
打赏
举报
回复
楼上的兄台,感谢你,pojo,po,已经基本上明白了。
但是vo能解释更明白一些吗? vo你的意思是表示层是吗?
sjg008
2005-04-15
打赏
举报
回复
转载HIBERNATE中文论坛有关POJO的讨论:
POJO = pure old java object or plain ordinary java object or what ever.
PO = persisent object 持久对象
就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。全都是这样子的:
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 StateManager中取出来,所以一旦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的功能强。
hellboys
2005-04-15
打赏
举报
回复
可以说的更明白些吗,他们都是承担什么作用的呢?
onlyxu
2005-04-15
打赏
举报
回复
po Persistent Object
bo business object
jo java对象
lo ???
vo ValueObject或ViewObject
pojo 普通java对象
PO
,
BO
,
VO
和
PO
JO
的区别
PO
:persistent object 持久对 1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个
PO
...一个中间对象,可以转化为
PO
、DTO、
VO
。 1 .
PO
JO
持久化之后==〉
PO
(在运行期,由Hibernate中的cglib动态把
PO
JO
PO
,
BO
,
VO
和
PO
JO
的区别
PO
:persistent object 持久对象 1 .有时也被称为Data对象,对应数据库中的entity,可以简单认为一个
PO
对应数据库中的一条记录。 2 .在hibernate持久化框架中与insert/delet操作密切相关。 3 .
PO
中不应该包含...
个人对于
po
、
bo
、
vo
的理解
po
、
bo
、
vo
的理解
PO
、
VO
、
BO
、DTO通俗理解(附加代码讲解)
PO
、
VO
、
BO
、DTO通俗理解(附加代码讲解) 前言:开胃菜 对于一个初学程序的小白面对这么多专业名词可能有些困惑,但是不要怕,请让万小猿带你一一揭开谜题。 概念的东西砸门不喜欢,直接上硬货!!!(这是我...
query
bo
po
vo
dto dao
po
jo
区别
bo
是用来封装对象的,他可以有多个
vo
的集合,可以包含list类型的
vo
的抽象实体类
po
对应数据库表字段
vo
是在代码流程中处理的数据,一般与
po
相似 但不相同,一般从数据库中查出来的数据是
po
类型的,接口返回的时候是...
Java EE
67,515
社区成员
225,878
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章