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

Posted 标识符

篇首语:对于攀登者来说,失掉往昔的足迹并不可惜,迷失了继续前时的危险。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 别让Hibernate偷走了你的标识符[3]相关的知识,希望对你有一定的参考价值。

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

  当你想要创建一个将其它域对象保存在Set Map或是List里面的域对象时 这是一个问题 为了解决这个问题 你必须为你的所有对象提供一种equals()和hashCode()的实现 这种实现能够保证在它们在对象保存前后正确工作并且当对象在内存中时(返回值)不会改变 Hibernate参考文档提供了以下的建议

   不要使用数据库标识符来实现等价的判断 而应该使用商业键值(business key) 一种唯一的 通常不改变的属性的结合体 当一个buk不可序列化对象(transient object)被持久化的时候 数据库标识符会发生改变 当一个不可序列化实例(常常和detached instances在一起)被包含在一个Set里面时 哈希值的改变会破坏Set的从属关系 商业键值的属性并不要求和数据库主键一样稳定 你只要保证当对象在某个Set中时它们的稳定性

   我们推荐判断商业键值的等价性来实现equals()和hashCode()两个方法 这意味着equals()方法只比较能够区分现实世界中的实例的商业键值(某个候选码)的属性 (Hibernate 参考文档 v )

  换句话说 equals()和hashCode()使用商业键值进行处理 而对象使用Hibernate生成的键值作为id值 这要求对于每个对象有一个相关的不会改变的商业键值 可是 并不是每个对象类型都有这样的一种键 这时候你可能会尝试使用会改变但不时常改变的字段 这和商业键值不必和数据库主键一样稳定的思想相吻合 当对象在Collection中时候如果这种键不改变 那它们似乎就 足够好 了 这是一种危险的主张 这意味着你的应用程序可能不会崩溃 但是前提是没有人在特定的情况下更新了特定的字段 所以 应当有一种更好的解决方案 而它确实也存在 试图创建和维护在对象和数据库行两者间有着分离的定义的标识符是目前为止讨论的所有问题的根源 如果我们统一所有标识符的形式 这些问题都将不复存在 也就时说 作为以数据库为中心和以对象为中心的标识符的替代品 我们应该创建一种通用的 特定于实体的ID来代表数据实体 这种ID应该在数据第一次输入的时候产生 无论一个唯一数据实体是保存在数据库 是作为对象驻留在内存 还时存贮在其它格式的介质中 这个通用ID都应该可以识别它 通过使用数据实体第一次创建时指派的ID 我们可以安全的回到我们对equals()和hashCode()的原始定义 它们只是简单地使用了这个id

public class Person  // assign an id as soon as possible  private String id = IdGenerator createId();  private Integer version; public String getId() return id;  public void setId(String id) this id = id;  public Integer getVersion() return version;  public void setVersion(Integer version) this version = version;  // Person specific fields and behavior here  public boolean equals(Object o) if (this == o) return true; if (o == null || !(o instanceof Person)) return false; Person other = (Person)o; if (id == null) return false; return id equals(other getId());   public int hashCode() if (id != null)  return id hashCode(); else  return super hashCode();  

  这个例子使用id作为equals()方法判断等价的标准以及hashCode()返回哈希值的来源 这就简单了许多 但是 要让它正常工作 我们需要两样东西 首先 我们需要保证每个对象在被保存之前都有一个id值 在这个例子里 当id变量被声明的时候 它就被指派了一个值 其次 我们需要一种判断这个对象是新生成的还是之前保存过的的手段 在我们最早的例子中 Hibernate检查id字段是否为空来判断对象是否时新生成的 既然我们的对象id永远不为空 这个方法显然不再有效 为了解决这个问题 我们可以很容易的配置Hibernate 让它检查version字段 而不是id字段是否为空 version字段是一个更为恰当的用来判断你的对象是否被保存过的指示器

cha138/Article/program/Java/ky/201311/28967

相关参考

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

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

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

别让Hibernate偷走了你的标识符[1]  以下文字资料是由(全榜网网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语

别让失眠加速你的衰老等

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

别让你的心“决堤”

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

别让你的婚姻跳槽

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