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

Posted

篇首语:也许就是那么一颗不甘服输的心带着我奋斗下去!本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 别让Hibernate偷走了你的标识符[2]相关的知识,希望对你有一定的参考价值。

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

  Hibernate映像文件指明了Person的id字段代表了数据库中的ID列(也就是说 它是PERSON表的主键) 包含在id标签中的unsaved value= null 属性告诉Hibernate使用id字段来判断一个Person对象之前是否被保存过 ORM框架必须依靠这个来判断保存一个对象的时候应该使用SQL的INSERT字句还是UPDATE字句 在这个例子中 Hibernate假定一个新对象的id字段一开始为null值 当它第一次被保存时才id才被赋予一个值 generator标签告诉Hibernate当对象第一次保存时 应该从哪里获得指派的id 在这个例子中 Hibernate使用数据库序列作为产生唯一id的来源 最后 version标签告诉Hibernate使用Person对象的version字段进行并发控制 Hibernate将会执行乐观锁方案(optimistic locking scheme) 根据这个方案 Hibernate在保存对象之前会检查对比对象的version值和数据库中相应数据的version值

  我们的Person对象还缺少的是equals()方法和hashCode()方法的实现 既然这是一个持久化对象 我们并不想依赖于这两个方法的缺省实现 因为缺省实现并不能分辨代表数据库中同一实体的不同实例 一种简单而又显然的实现方法是利用id字段来进行equal()方法的比较以及生成hashCode()方法的结果

public boolean equals(Object o)  if (this == o) return true;  if (o == null || !(o instanceof Person)) return false; Person other = (Person)o;  if (id == other getId()) return true;  if (id == null) return false; // equivalence by id  return id equals(other getId());public int hashCode()  if (id != null) return id hashCode();   else return super hashCode();  

  不走运的是 这个实现存在着问题 当我们首次创建Person对象的时候id的值是null 这意味着任何两个没有被保存的Person对象都将被认为是等价的 如果我们想创建一个Person对象并把它放到Set数据结构中 再创建了一个完全不同的Person对象也把它放到同一个Set里面 事实上第 个Person对象并不能被加入 这是因为Set会断定所有未经保存的对象都是相同的

  你可能会试探著去实现一个只使用被设置过的id的equals()方法 毕竟 如果两个对象都没有被保存过 我们可以假定它们是不同的对象 这是因为在它们被保存到数据库的时候 它们会被赋予不同的主键

public boolean equals(Object o)  if (this == o) return true; if (o == null || !(o instanceof Person)) return false;Person other = (Person)o; // unsaved objects are never equal  if (id == null || other getId() == null) return false;  return id equals(other getId());

  这里有个隐藏的问题 Java的Collection框架在它的生命周期中需要基于不变字段的equals()和hashCode()方法 换句话来说 当一个对象处在Collection中的时候 你不可以改变equals()和hashCode()的返回值 举个例子 下面这段程序

Person p = new Person();Set set = new HashSet();set add(p);System out println(set contains(p));p setId(new Long( ));System out println(set contains(p));

   打印结果: true false

  对set contains(p)的第 次调用返回了false是因为Set再也找不到p了 用书面化的语言讲 Set丢失了这个对象!这是因为当对象在Set中时 我们改变了hashCode()的返回值

cha138/Article/program/Java/ky/201311/28969

相关参考

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

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

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

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

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

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

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

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

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

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

知识大全 求一篇诗歌,急

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

知识大全 映射对象标识符

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

别让失眠加速你的衰老等

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

别让你的心“决堤”

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

别让你的婚姻跳槽

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