首页   新闻   数据库   JAVA  

别让Hibernate偷走了您的身份

别让Hibernate偷走了您的身份

在这个例子中,我们遵循了同时持有id字段和version字段的最佳实践。Hibernate映射文件指明了Person的id字段代表数据库中的ID列(也就是说,它是PERSON表的主键)。version字段是一个更恰当的用来判断对象是否被保存过的指示符。
企业级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()方法有关联是因为所有相等的对象都应该返回相同的hashCode。默认情况下,equals()方法仅仅比较对象引用。一个对象和它自身是相等的,而和其他任何实例都不相等。对于持久性对象来说,重写这两个方法,让代表着数据库中同一行的两个对象被视为相等是很重要的。而这对于Java中Collection(Set、Map和List)的正确工作更是尤为重要。
  为了阐明实现equal()和hashCode()的不同途径,让我们考虑一个准备持久存储到数据库中的简单对象Person。  


最新发布
  更多>>..
别让Hibernate偷走了您的身份
Hibernate的缓存机制分析
再说WEB2.0:仍处于商业模式摸索阶段
SIG看好搜狐 称门户、网游和Web2.0战略不可分
Web2.0对广告和市场营销的启示
报告称5年后企业Web2.0支出将达46亿美元
开源观察:是谁在宣扬Java过时论?
在Struts 2中使用JSON Ajax支持
Apache Struts 2 GA 官方推荐版本发
Java Web层的下一个王者是谁?
Struts的七大实战心法
实例讲解如何用Struts向MySQL中储存图片
深入分析JSF与Struts的异同
用Java实现FTP服务器
手机Java程序披上“Flash外衣”
Sun以全新OpenSolaris服务和工具打造全球
谷歌CEO来华推"云计算" 唱衰微软收购雅虎
上海神图信息技术开发有限公司招聘
Spring的MVC模型运行序列分析
利用DWR开发基于Ajax的文件上载portlet
关于我们广告服务| 免费条款投诉意见友情链接联系我们
73cc.com版权所有 不得转载 皖ICP备05020835号