2009-08-02 46 views
0

在Java持久与Hibernate,加文认为,我们用平等比较的业务重点。商业密钥不仅可以涉及多个领域的比较,而且也不能保证“完美”的商业密钥的语义将来不会改变。我们生活在非理想世界,商业需求和法律变化非常频繁。在这种情况下,我们将留下存储在多个业务密钥语义中的数据库中的数据。我想将问题分解成两部分:Hibernate对象的身份

  1. 当我们严格处理持久或分离的对象时。
  2. 当我们处理瞬时对象。

  3. 我还没有看到在使用了平等和hashCode代理键,如果我们处理的持续性和分离对象的任何缺点。如果两个持久对象具有相同的主键,则它们是相等的。这是错误的假设?

  4. 当我们处理瞬态对象时,我们可以使用业务键语义来比较对象,并且如果尝试使用相同的业务关键字持续两个临时对象但余数属性中的值不同,则可以使用合并策略。

在阅读繁重的应用程序中,大部分事务都被读取/更新,这种策略应该会产生更好的性能。

+0

什么是“商业钥匙”? – 2009-08-02 22:44:50

+1

商业密钥唯一标识对象 - 该密钥不应来自已经解释过的数据库。可以是实体中的UUID或组合或字段。 – JamesC 2009-08-03 11:19:57

回答

1

与对象的身份和Hibernate的问题是做短暂的对象:是主键创建时?如果答案是在写入数据库时​​(使用数据库控制的主键生成(例如Oracle序列)),则存在潜在的问题。

如果使用主键作为平等检查的基础,并且它是散列码生成的一部分,那么您将破坏散列码合约,因为在生成主键之前和之后对象不会相同。

如果可以,只要使用,您可以设置在创建对象的时候(如UUID)生成的主键。这可确保您的哈希码和相等性检查保持一致。

1

我曾经感到苦恼发现每个类别的最佳业务键和最终会在情况下使用UUID那里实在是没有什么独特之处在于可以永远不会改变。但是现在,我使用数据库代理键,并避免了必须依赖相等性来实现瞬态对象的情况。看起来更简单,不易出错,速度更快。它可能取决于应用程序的类型,但对于典型的CRUD应用程序,该对象通常在进入数据库之前必须在集合中进行处理。