2019/8/18InstituteofComputerSoftwareNanjingUniversityPersistentObjects持久对象酒店设计问题解决方案Language-levelDatabasesRelationalO-RObject-OrienteddatabaseHibernate简介讨论2019/8/18InstituteofComputerSoftwareNanjingUniversityPersistenceWhathappenstotheobjectsofanapplicationwhenitsexecutionterminates?TransientobjectsPersistentobjects2019/8/18InstituteofComputerSoftwareNanjingUniversity//Serializetoday'sdatetoafile.FileOutputStreamf=newFileOutputStream(tmp);ObjectOutputs=newObjectOutputStream(f);s.writeObject(Today);s.writeObject(newDate());s.flush();Java:WritingtoanObjectStream2019/8/18InstituteofComputerSoftwareNanjingUniversityReadingfromanObjectStream//Deserializeastringanddatefromafile.FileInputStreamin=newFileInputStream(tmp);ObjectInputStreams=newObjectInputStream(in);Stringtoday=(String)s.readObject();Datedate=(Date)s.readObject();2019/8/18InstituteofComputerSoftwareNanjingUniversity对象结构的存储与提取对象持久化的难点之一:对象之间的引用2019/8/18InstituteofComputerSoftwareNanjingUniversity对象结构的存储与提取需持久化整个对象引用闭包PersistenceclosureJava的serializable规则缺省规则:非static非transient的数据成员用户定义classListimplementsSerializable{Listnext;privatestaticfinalObjectStreamField[]serialPersistentFields={newObjectStreamField(next,List.class)};}2019/8/18InstituteofComputerSoftwareNanjingUniversity对象结构的存储与提取存储格式问题同构环境异构环境XML(Tool:Caster…)2019/8/18InstituteofComputerSoftwareNanjingUniversity对象结构的存储与提取闭包可能太大小对象引用(共享的)大对象2019/8/18InstituteofComputerSoftwareNanjingUniversity对象结构的存储与提取Java的transient修饰子Transientfields不被序列化Static也不开发者负责维护2019/8/18InstituteofComputerSoftwareNanjingUniversitySchemaevolution持久化问题的又一难点读取对象的类不是存储对象的类,比如做了修改,或是其某个子类?Naïveapproaches放弃先前持久化的对象一次性全体转换自动对象转换DetectionNotificationCorrection2019/8/18InstituteofComputerSoftwareNanjingUniversity自动对象转换Detection:标记对象版本Policies:nominalvs.structuralNominal:classversioning命名ConfigurationManagement或者Randomnumber(OLE2)集中注册处Structural:依据Class结构据之生成Classdescriptor,类名;类全文;类名+属性+方法;再加类不变式2019/8/18InstituteofComputerSoftwareNanjingUniversity自动对象转换Notification语言机制支持EiffelinClassGENERALcorrect_mismatchisdoraise_mismatch_exceptionend开发者可在ANY中为整个系统重定义该feature2019/8/18InstituteofComputerSoftwareNanjingUniversity自动对象转换Correction增加attribute删除attribute核心在于维护不变式2019/8/18InstituteofComputerSoftwareNanjingUniversity自动对象转换:JavaserialVersionUID自动定义(根据类文件生成)1.Classname2.Theclassmodifiers3.Thenameofeachinterface4.Foreachfieldoftheclass(exceptprivatestaticandprivatetransientfields):ThenameofthefieldThemodifiersofthefieldThedescriptorofthefield5.Foreachmethodincludingconstructors,exceptprivatemethodsandconstructors:ThenameofthemethodThemodifiersofthemethodThedescriptorofthemethod2019/8/18InstituteofComputerSoftwareNanjingUniversity自动对象转换:Java手工指定ANY-ACCESS-MODIFIERstaticfinallongserialVersionUID=42L;类改变时仍然能够反序列化Java定义了一些“兼容”条件,符合条件的自动转换可以容忍的:addingfieldsetc太糟糕的:“Changingthetypeofafield”,delfields,etc2019/8/18InstituteofComputerSoftwareNanjingUniversity对于实在“糟糕”的类修改可以定制序列化和反序列化方法privatevoidreadObject(ObjectInputStreamin){}privatevoidwriteObject(ObjectOutputStreamout){}2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库为什么要数据库序列化:单个对象入口的一个对象闭包,须一次提取、重建所有对象基于内容的查询?并发存取?2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库数据库PersistenceProgrammablestructureArbitrarysizeAccesscontrolProperty-basedqueeringIntegrityconstraintsAdministrationSharingLockingTransaction自然地,要用数据库来存储持久化对象2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库关系型数据库:数据库的主流关系关系代数Selection,Projection,Join2019/8/18InstituteofComputerSoftwareNanjingUniversity2019/8/18InstituteofComputerSoftwareNanjingUniversity2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库对象关系互操作模型不同如果有时对象系统必须处理关系数据库中的数据有时对象结构很简单,关系模型能够表达否则impedancemismatch2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库impedancemismatch关系数据库数据结构规整,成员数目类型固定结构简单,成员类型属于一个既定小集合这些类型由大小固定的类型组合而成那么大小不定的域?表示对象引用的域?基于引用的间接查询?继承?更重要的是:对象identity语义2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库面向对象数据库解决面向对象软件系统进行对象持久化时,与关系数据库间的不匹配问题克服关系数据库本身的限制提供更高级的数据库设施2019/8/18InstituteofComputerSoftwareNanjingUniversity对象持久化与数据库面向对象数据库最小要求[zdonik1990]数据库功能支持封装对象联系于唯一ID支持对象引用此外对象版本,类版本与schemaevolution,Longtransactions,lockingqueris2019/8/18InstituteofComputerSoftwareNanjingUniversityHibernate:Object-RelationMapping当前的现实:应用分层两层结构三层结构N-层结构2019/8/18InstituteofComputerSoftwareNanjingUniversity2019/8/18InstituteofComputerSoftwareNanjingUniversity2019/8/18InstituteofComputerSoftwareNanjingUniversity2019/8/18InstituteofComputerSoftwareNanjingUniversity对象-关系映射简单映射将一个类中的一个数据成员定为关键字其它数据成员为属性添加、更新、删除、查询2019/8/18InstituteofComputerSoftwareNanjingUniversity对象-关系映射继承:方案1:子类父类各自映射到各自的关系上。优点?缺点?2019/8/18InstituteofComputerSoftwareNanjingUniversity对象-关系映射继承方案2:所有继承自一个类的类都映射到一个表上增加一栏标记当前记录对应的对象的类优点?缺点?2019/8/18InstituteofComputerSoftwareNanjingUniversity对象-关系映射继承方案3:父类映射的