看完不懂,你拍我——ORM框架中的对象状态

标签: orm 框架 对象 | 发表时间:2013-06-20 10:41 | 作者:jianxin1009
出处:http://blog.csdn.net

        不论是EJB3.0还是Hibernate,他们统称为ORM框架。虽然每个框架对对象的状态都有自己的理解,但是都免不了有共性的东西。

        在Hibernate中,对象的状态分为Transient、Persist、Detached,而在EJB中有四种状态,分别为:New、Managed、Detached、Removed。

        其中Transient和New对应,都是未有Id值(随后说下这个Id是什么意思),尚未放在数据库映像(SessionFactory、PersistenceContext)中,对此数据进行修改,数据库中的数据不会改变。

        Persist与Managed对应,是被容器管理的对象,也称为持久化对象。对此对象进行操作会影响数据库中的数据。

        二者的Detached个人感觉是一样的,是离线对象的意思。表明此对象未删除,只是实体管理对象关闭了而已,并不是删除。

        二者关于对象状态的偏差就是EJB多了一个Removed状态,此状态是在你remove对象后,对象进入此状态。而在Hibernate中,如果调用了remove方法,对象会进入Transient状态,由于目前对removed状态接触的不多,所以暂时就将它归为Transient状态吧。其实EJB这样分也是有一定道理的。下面就进行详细说明

        ORM对状态的分类,其实是根据Id和是否被管理来区分的:

        大家都知道,在用这两个ORM的时候,除了要将类声明为Entity,另外不可少的一步就是必须声明Id生成策略。新new的对象,在Session或EntityManager(后面同意成为Session)调用save方法后,会给对象赋予Id,这样这个对象就同时被Session管理和有了Id。也就是Persist状态的对象,对此状态的对象进行修改,会默认调用session的update方法。

        新new的对象在save之前,状态为Transient,此时对象未被分配Id,未被容器管理,所以你无论怎样修改,它都只是一个普普通通的Java对象。

        出于Detached状态的对象,如果你此时将Session关闭,那么这个对象就有Id,而未被容器管理,所以此对象从某个角度来说,只是一个又Id的Transient对象而已,也就是说你自己New一个对象,然后将此对象的Id进行赋值,那么此对象就可以说是一个Detached对象,只不过里面的值和数据库中的值有些差别而已,如果你显式调用update方法,如果你的Id在数据库中有,那么它是可以更新上去的。

        EJB的划分之所以为4种,是因为他自己给自己挖了一个坑,关于New的描述是这样的:未有Id值,尚未被容器管理。其实这样说很简单,让人也很容易接受。我其实就是这样理解的,因为很通俗易懂,并且可以明显猜测到他的执行过程干了些什么。但是在Remove的时候,此类不再被容器所管理,但是有Id值,而且数据库中也没有,这三点同时囊括了New和Detached的特点,按照他的分类就不能放到这两种的任何一种,所以就多出来一个Removed状态。

        回头再看一下Hibernate对于Transient的描述:使用New操作符初始化的对象不是立刻就持久化的,他们没有跟数据库表相关联行为,只要应用不在引用这些对象,他们的状态将会丢失,并由垃圾回收机制回收。所以在调用Remove方法后改对象就成了一个瞬时对象。

        相比较Hibernate描述的更加抽象,但是理解起来是有一定困难的,因为如果不是你自己查看对象状态,你根本不知道Transient和Persist到底有什么差别,而EJB描述的具体了,就会发现这抽象的几种不够用。希望通过下面的一个表格,来很好的说明一下ORM中对象状态这回事。

        (其中括号中的为EJB中的对象状态)

                

        他们之间的状态转换如下:

                

        

作者:jianxin1009 发表于2013-6-20 10:41:29 原文链接
阅读:55 评论:0 查看评论

相关 [orm 框架 对象] 推荐:

看完不懂,你拍我——ORM框架中的对象状态

- - CSDN博客架构设计推荐文章
        不论是EJB3.0还是Hibernate,他们统称为ORM框架. 虽然每个框架对对象的状态都有自己的理解,但是都免不了有共性的东西.         在Hibernate中,对象的状态分为Transient、Persist、Detached,而在EJB中有四种状态,分别为:New、Managed、Detached、Removed.

Android orm 框架xUtils简介 - lsc183

- - 博客园_首页
  数据库操作建议用ORM框架,简单高效. 这里推荐xUtils,里面包含DBUtils. github地址:https://github.com/wyouflf/xUtils.   获得数据库实例建议用单例模式.   创建一个实体类,对应数据库中的表.     private int id; //主键ID,必须.

最受欢迎的5个Android ORM框架

- - 极客521 | 极客521
在开发Android应用时,保存数据有这么几个方式,. 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式,即本地数据存储,如嵌入式 SQLite,你可以选择直接使用SQL语句、Content Provider 或 ORM(对象关系数据映射).

文章: MongoDB、Java及ORM

- - InfoQ cn
目前有很多互相竞争的NoSQL产品,它们使用的方式不尽相同,但都能很好地解决大数据问题. MongoDB就是其中一款非常不错的产品. MongoDB是面向文档、无Schema的存储解决方案,它用JSON风格的文档展现、查询、修改数据. MongoDB有很丰富的文档,安装和设置都很简单,而且易于扩展.

Java 8:ORM已经过时了

- - Java译站
最近几十年来,关于ORM究竟还有没有用的争论一直不断. 很多人承认Hibernate和JPA确实很好的解决了不少实际的问题(通常是复杂对象的持久化),但有些人认为,对于面向数据的应用而言,复杂的映射关系则有点大材小用了. JPA通过在目标类型上使用硬编码的注解,来建立标准的声明式的映射规则,进而完成映射关系.

为什么要旗帜鲜明地反对 orm 和 sql builder

- - No Headback
这个问题在五六年前和前同事讨论过,没想到这么多年过去了,又要跟其他工程师再讨论一遍,有点恍如隔世. 因为我比较懒,所以记录一篇文章,以后碰到类似的问题就不再掺和了. toC 场景的系统大多要面对较高的 QPS,即使是小型/中型公司使用 MySQL,没有那么高的查询量,单表数据在百万量级也属常见. 无状态的服务当前用 k8s 的 HPA 能力能够做到很好的扩容,结合基本的优化知识,大多数问题能够较好地被初/中级工程师解决.

Android工具库xUtils1.9.8发布-orm性能优化,图片加载优化...

- - 开源中国社区最新新闻
感谢关注xUitls的网友最近一段时间给予的热心反馈,xUtils近期做了很多细节优化之后,功能和api已经稳定.         1.9.8主要更新内容:.         * orm模块添加列类型转换接口,支持自定义类型字段作为列映射;.         * bitmap模块优化默认参数,取消默认动画,加载更快速.

PHP框架 Yaf

- Le - 开源中国社区最新软件
Yaf是一个C语言编写的PHP框架,Yaf 的特点: 用C语言开发的PHP框架, 相比原生的PHP, 几乎不会带来额外的性能开销. 所有的框架类, 不需要编译, 在PHP启动的时候加载, 并常驻内存. 更短的内存周转周期, 提高内存利用率, 降低内存占用率. 支持全局和局部两种加载规则, 方便类库共享.

javascript对象转json

- - JavaScript - Web前端 - ITeye博客
把javascript对象转成json. 已有 0 人发表留言,猛击->> 这里<<-参与讨论. —软件人才免语言低担保 赴美带薪读研.

微服务框架-基础框架

- - 人月神话的BLOG
上面一篇文章对SpringBoot框架做了一下简单验证,在文中也写到SpringBoot重点还是在单个微服务模块的开发,已经对于微服务接口开放的便捷性上,而对于微服务基础架构和管控治理层面没有太多支持. 对于微服务基础框架可以看作是微服务治理架构的核心内容,包括了对微服务模块的全生命周期管理能力,这个能力包括了微服务网关APP,DevOps,Docker和云集成,安全,负载均衡,服务注册和发现等诸多能力.