来看别让Hibernate偷走了你的标识符
令人可喜的是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。 如果要向java web方向发展也要吧看看《Java web从入门到精通》学完再到《Struts2.0入门到精通》这样你差不多就把代码给学完了。有兴趣可以看一些设计模块和框架的包等等。 你一定会高兴地说,哈哈,原来成为Java高手就这么简单啊!记得Tomjava也曾碰到过一个项目经理,号称Java很简单,只要三个月就可以学会。 其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。 是一种由美国SUN计算机公司(Sun Microsystems, Inc.)所研究而成的语言 Java 不同于一般的编译执行计算机语言和解释执行计算机语言。它首先将源代码编译成二进制字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码。从而实现了“一次编译、到处执行”的跨平台特性。 一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。 Java自面世后就非常流行,发展迅速,对C++语言形成了有力冲击。Java 技术具有卓越的通用性、高效性、平台移植性和安全性,广泛应用于个人PC、数据中心、游戏控制台 是一种突破用户端机器环境和CPU 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展 一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从 你现在最缺的是实际的工作经验,而不是书本上那些凭空想出来的程序。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。 应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展
页:
[1]