赞 | 0 |
VIP | 2 |
好人卡 | 27 |
积分 | 1 |
经验 | 26327 |
最后登录 | 2019-10-13 |
在线时间 | 953 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 110
- 在线时间
- 953 小时
- 注册时间
- 2007-4-25
- 帖子
- 805
|
回复 chaochao 的帖子
而且所有的副本也都是从数据库这个唯一的地方取出的,修改也是要向数据库发送数据的。总之对数据库中数据的操作,也都是在对数据库这一个地方操作,Hibernate其实就相当于减少了程序员与数据库交互的代码,使数据库的操作看起来更像面向对象的程序。
实际的应用中充斥着动态数据,有时可能会希望把动态数据维持到数据库中,而对于使用 Hibernate 的人来说,规范就是建立一个 transient 的对象,之后用 Transaction#commit 使其持久。但在此之前,如果你想做个域的重复值检测(即如果表中已经有一行包含了特定的几个域的相同值就不 commit),传统的做法自然是操纵列的 UNIQUE CONSTRAINT,但如果出于某种原因你不想 ALTER 列的属性,就只能让 Hibernate 把数据 SELECT 出来,然后挨个比较映射后的对象全部属性了。默认的 Object#== 自然做不到这一点,所以让子类覆盖。
我很赞同你上面关于避免数据库对象副本的观点,普通的 RM 游戏确实完全不需要这么干。然而覆盖 Object#== 只是一个思路,可以用来定义某个类型元素的相等性二元关系。只有有了二元关系,各种集合论中的问题才能解决,比如求并集。这个思路并不是针对和 RM 数据库数据挂钩的对象类型,完全可以应用在更宏观的场合,而在该场合下会可能会无法避免地出现对象的拷贝。以前有人提过一个在用 RM 时遇见的这样的问题,就是找一个方位向量集合中所有重合的方位向量,重合的向量对象在内存中身份不同,但 (x, y) 相同。
另外,如果你说的“佩服你的耐心”是出于属性太多的原因,那在支持反射成员变量的语言中压根儿不是问题。 |
|