知识大全 别让Hibernate偷走了你的标识符[1]

Posted 标识符

篇首语:做一个决定,并不难,难的是付诸行动,并且坚持到底。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 别让Hibernate偷走了你的标识符[1]相关的知识,希望对你有一定的参考价值。

别让Hibernate偷走了你的标识符[1]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  当对象持久化到数据库中时 对象的标识符总时很难被恰当的实现 尽管如此 问题其实完全是由存在着在保存之前不持有ID的对象的现象衍生而来的 我们可以通过从诸如Hibernate这样的对象—关系映像框架手中取走指派对象ID的职责来解决这个问题 相对的 一旦对象被实例化 它就应该被指派一个ID 这使对象标识符变成简单而不易出错 也减少了领域模型中需要的代码量

  企业级Java应用程序常常把数据在java对象和关系型数据库之间来回移动 从手动编写SQL代码到使用诸如hibernate这样的成熟的对象——关系映像(ORM)解决方案 有很多种方法可以实现这个过程 无论你采用什么样的技术 一旦你开始将java对象持久化到数据库中 对象标识符都将成为一个复杂而且难以管理的课题 可能出现的情况是 你实例化了两个不同的对象 而它们却代表了数据库中的同一行 为了解决这个问题 你可能采取的措施是在你的持久化对象中实现equals() 和hashCode()这两个方法 可是要恰当的实现这两个方法比乍看之下要有技巧一些 让问题更糟糕的是 那些传统的思路(包括hibernate官方文档所提倡的那些)对于新的工程并不一定能提出最实用的解决方案

  对象标识在虚拟机(VM)中和在数据库中的差异是问题滋生的温床 在虚拟机中 你并不会得到对象的id 你只是简单的持有对象的直接引用 而在幕后 虚拟机确实给每个对象指派了一个 字节大小的id 这个id才是对象的真实引用 当你将对象持久化到数据库中的时候 问题开始产生了 假定你创建了一个Person对象并将它存入数据库(我们可以叫它person ) 而你的其它某段代码从数据库中读取了这个Person对象的数据并将它实例化为另一个新的Person对象(我们可以叫它Person ) 现在你的内存中有了两个映像到数据库中同一行的对象 一个对象引用只能指向它们俩的其中一个 可是我们需要一种方法来表示这两个对象实际上表示著同一个实体 这就是(在虚拟机中)引入对象标识符的原因

  在java语言中 对象标识符是由每个对象都持有的equals()方法(以及相关的hashCode()方法)来定义的 无论两个对象(引用)是否为同一个实例 equals()方法都应该能够判别出它们是否表示同一个实体 hashCode()方法和equals()方法有关联是因为所有被判断等价(equal)的对象都应该返回相同的哈希值(hashCode) 在缺省实现中 equals()方法仅仅比较对象的引用 一个对象和它自身是等价的 而和其它任何实例都不等价 对于持久化对象来说 重写这两个方法 让代表着数据库中同一行的两个对象被判为等价是很重要的 而这对于java中的Collection数据结构(Set Map和List)的正确工作更是尤为重要

  为了阐明实现equal()和hashCode()的不同途径 让我们一起考虑一个准备持久化到数据库中的简单对象Person

public class Person  private Long id;  private Integer version; public Long getId() return id;  public void setId(Long id) this id = id;   public Integer getVersion() return version;   public void setVersion(Integer version) this version = version;   // person specific properties and behavior

  在这个例子中 我们遵循了同时持有id字段和version字段的最佳实践 Id字段保存了在数据库中作为主键使用的值 而version字段则是一个从 开始增长的增量 随着对象的每次更新而变化(它帮助我们避免并发更新的问题) 为了看的更清楚 我们也一起看一下Hibernate把这个对象持久化到数据库的映像文件

<?XML version= ?><hibernate mapping package= my package > <class name= Person table= PERSON ><id name= id column= ID unsaved value= null ><generator class= sequence > <param name= sequence >PERSON_SEQ</param></generator></id><version name= version column= VERSION /> <! Map Person specific properties here ></class>      </hibernate mapping>

cha138/Article/program/Java/ky/201311/28970

相关参考

知识大全 别让Hibernate偷走了你的标识符[4]

别让Hibernate偷走了你的标识符[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  下面

知识大全 别让Hibernate偷走了你的标识符[3]

别让Hibernate偷走了你的标识符[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  当你

知识大全 别让Hibernate偷走了你的标识符[5]

别让Hibernate偷走了你的标识符[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Pe

知识大全 别让Hibernate偷走了你的标识符[2]

别让Hibernate偷走了你的标识符[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Hi

知识大全 别让Hibernate偷走了您的身份

别让Hibernate偷走了您的身份  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  企业级Jav

知识大全 求一篇诗歌,急

求一篇诗歌,急!心灵之约谁偷走了你的青春谁搅乱你的舞步为何有早谢的花朵在枉费宝贵的桃李年华彷徨彷徨走不完命运的深巷何处是幸福的彼岸逃避逃避远离了万家灯火却挣不脱难言的忧烦放下你的包袱背起你的行囊年轻的

知识大全 映射对象标识符

精通Hibernate:映射对象标识符  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java语

别让失眠加速你的衰老等

睡眠与生物钟障碍系列二别让失眠加速你的衰老睡眠是人类每天必不可少的生理活动。睡眠质量好坏、时间长短与人体健康、寿命长短息息相关。人过中年,不少人经常不能安眠,入睡难,易惊醒,多梦,醒后难再入睡。时间久

别让你的心“决堤”

韩国留学生赵承熙在美国弗吉尼亚理工大学杀人事件,被人们广泛关注。为什么现代物质文明发展到了前所未有的水平,却经常出现自残和凶杀?有学说认为,当一个人经历了自认为不公正的待遇,或者经历了重大的挫折后,就

别让你的婚姻跳槽

“模范丈夫”突然一反常态,执意要离婚,妻子极力挽救,可情况却变得越来越糟,这究竟是怎么了?芽让我们来看一看这位女士所面临的烦恼。一天,一位中年女士急匆匆地来到诊所。她的第一句话就是:“丈夫非要与我离婚