别让Hibernate偷走了你的标识符[Java编程]
本文“别让Hibernate偷走了你的标识符[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.
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字段则是一个从0开始增长的增量,随着对象的每次更新而改变(它帮忙我们避免并发更新的问题).为了看的更清楚,我们也一同看一下Hibernate把这个对象长期化到数据库的映像文件.
<?xml version="1.0"?>
<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>
以上是“别让Hibernate偷走了你的标识符[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |