- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
对象的持久生命周期 持久类和一般类只有概念上的区别,从代码上看没有区别,持久类不知道自己的持久状态,所有的业务逻辑也与对象是在内存中还是在数据库中无关。 内存中的对象只有两种状态:有用和无用。 Hibernate通过session来控制对象的持久生命周期:transient,persistent, detached. Transient objects new生成的对象称为Transient,它没有与数据库中的某一行记录关联,一旦它被dereferenced就会被JVM回收。 hibernate认为所有的transient对象都是非事务的,hibernate不提供对这些对象的回滚支持。 仅仅被transient对象reference的对象也是transient对象。 Persistent objects persistent对象对应数据库的一条记录,并且具有database identity。 对于transient对象,调用session.save()可以将其转变为persistent object。如果通过session.load()加载一个对象,该对象也是persistent状态。 hibernate对persistent对象提供与数据库的同步支持和事务支持。 与数据库的同步 脏数据:数据仅仅在内存中更新而没有同步到数据库中称为脏数据。 hibernate会监测脏数据,在尽可能迟的时候做同步的动作。(transparent transaction-level write-behind) hibernate可以做到仅仅更新有变动的属性,但是需要在映射文件中设置dynamic-update=“true”,默认是false。这个功能用手工很难完成。 Detached objects 当调用session.close(),原先的persistent object就转化为detached object。 detached object和数据库失去了联系,但是它们不是transient object,它们具有datebase identity。 hibernate可以在新的事务中重新联系detached object。这样可以在多个层面中传递这些持久对象。对于多层架构的设计产生重大影响。 例子——1 例子——2 例子——3 对象的状态图 区分transient and detached对象 Identifier属性是否为null 对于非对象类型的Identifier,判断unsaved-value的值 优先考虑使用对象类型的Identifier,因为对象可以为null。 该方法只对synthetic keys有效,对于assigned keys和composite keys无效。 The scope of object identity no identity scope:数据的同一性没有范围,同一条记录分别取两次,返回的对象不满足a==b; transaction-scoped identity:在同一个事务中,同一条记录取两次,满足a==b,在事务级别需要缓存; Process-scoped identity:在同一个进程中只有一个对象被返回,范围达到整个JVM。 对象树 通常大型应用中操作的不可能只有一个对象,而是一个对象图。 Persistence by reachability compute被持久化时,它所reference的任何对象都被持久化,但是不包括“Electronics” 和 “Cell Phones”。 这是一个递归的过程。 在理想的环境中:root对象被加载,那么整个对象树在任何时候都可以被重新建立。如果某一个对象是非reachable的,那么就应该成为transient。 不可能的任务 数据库没有root的概念,只有foreign key。 Java有垃圾回收的算法,而数据库没有。 如果数据库要实现一个类似的,需要做全表扫描,那时不现实的。 对象图只是数据库的一部份。 persistence by reachability只解决了一半问题,如何完成persistence - transient。 解决之道—Cascade none:默认设置,hibernate不做级联任何动作。 save-update:如果item被持久化,那么所有被item所reference的bid都应该被持久化。 delete:如果item被删除,那么item所reference的bid的被删除。 all:= save-update + delete delete-orphan:如果Item所属的Bid Set中的某个Bit被删除, 那么数据库中Bid也被删除. 目 录 持久层的概念及必要性 hibernate框架及核心类介
原创力文档


文档评论(0)