|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
令人可喜的是java现在已经开源了,所以我想我上述的想法也许有一天会实现,因为java一直都是不断创新的语言,每次创新都会给我们惊喜,这也是我喜欢java的一个原因。
择要:
当对象耐久化到数据库中时,对象的标识符总时很难被得当的完成。只管云云,成绩实在完整是由存在着在保留之前不持有ID的对象的征象衍生而来的。我们能够经由过程从诸如Hibernate如许的对象—干系映像框架手中取走指派对象ID的职责来办理这个成绩。绝对的,一旦对象被实例化,它就应当被指派一个ID。这使对象标识符酿成复杂而不容易堕落,也削减了范畴模子中必要的代码量。
企业级java使用程序经常把数据在java对象和干系型数据库之间往返挪动。从手动编写SQL代码到利用诸如hibernate如许的成熟的对象---干系映像(ORM)办理计划,有良多种办法能够完成这个历程。不管你接纳甚么样的手艺,一旦你入手下手将java对象耐久化到数据库中,对象标识符都将成为一个庞大并且难以办理的课题。大概呈现的情形是:你实例化了两个分歧的对象,而它们却代表了数据库中的统一行。为懂得决这个成绩,你大概接纳的措施是在你的耐久化对象中完成equals()和hashCode()这两个办法,但是要得当的完成这两个办法比乍看之下要有技能一些。让成绩更糟的是,那些传统的思绪(包含hibernate官方文档所倡始的那些)关于新的工程其实不必定能提出最有用的办理计划。
对象标识在假造机(VM)中和在数据库中的差别是成绩滋长的温床。在假造机中,你其实不会失掉对象的id,你只是复杂的持有对象的间接援用。而在幕后,假造机的确给每一个对象指派了一个8字节巨细的id,这个id才是对象的实在援用。当你将对象耐久化到数据库中的时分,成绩入手下手发生了。假定你创立了一个Person对象并将它存进数据库(我们能够叫它person1)。而你的别的某段代码从数据库中读取了这个Person对象的数据并将它实例化为另外一个新的Person对象(我们能够叫它Person2)。如今你的内存中有了两个映像到数据库中统一行的对象。一个对象援用只能指向它们俩的个中一个,但是我们必要一种办法来暗示这两个对象实践上暗示着统一个实体。这就是(在假造机中)引进对象标识符的缘故原由。
在java言语中,对象标识符是由每一个对象都持有的equals()办法(和相干的hashCode()办法)来界说的。不管两个对象(援用)是不是为统一个实例,equals()办法都应当可以辨别出它们是不是暗示统一个实体。hashCode()办法和equals()办法有联系关系是由于一切被判别等价(equal)的对象都应当前往不异的哈希值(hashCode)。在缺省完成中,equals()办法仅仅对照对象的援用,一个对象和它本身是等价的,而和别的任何实例都不等价。关于耐久化对象来讲,重写这两个办法,让代表着数据库中统一行的两个对象被判为等价是很主要的。而这关于java中的Collection数据布局(Set,Map和List)的准确事情更是尤其主要。
为了分析完成equal()和hashCode()的分歧路子,让我们一同思索一个筹办耐久化到数据库中的复杂对象Person。
publicclassPerson{
privateLongid;
privateIntegerversion;
publicLonggetId(){returnid;}
publicvoidsetId(Longid){
this.id=id;
}
publicIntegergetVersion(){
returnversion;
}
publicvoidsetVersion(Integerversion){
this.version=version;
}
//person-specificpropertiesandbehavior
}
在这个例子中,我们遵守了同时持有id字段和version字段的最好理论。Id字段保留了在数据库中作为主键利用的值,而version字段则是一个从0入手下手增加的增量,跟着对象的每次更新而变更(它匡助我们制止并发更新的成绩)。为了看的更分明,我们也一同看一下Hibernate把这个对象耐久化到数据库的映像文件。
<?xmlversion="1.0"?>
<hibernate-mappingpackage="my.package">
<classname="Person"table="PERSON">
<idname="id"column="ID"unsaved-value="null">
<generatorclass="sequence">
<paramname="sequence">PERSON_SEQ</param>
</generator>
</id>
<versionname="version"column="VERSION"/>
<!--MapPerson-specificpropertieshere.-->
</class>
</hibernate-mapping>
<p>
在性能方面,在windows平台下,.net网页编程可能是占强项,要是把.net网页编程放在sun开发的操作系统上去运行呢?根本就运行不了,.net网页编程对其它操作系统的支持也很弱,性能也可能比不上java。 |
|