Hibernate和Ehcache的可变ID是否安全?

时间:2012-04-18 11:56:12

标签: java hibernate ehcache

在Hibernate和Ehcache中使用可变ID是否安全?另请注意,hashCode基于ID。

class Company implements Serializable {
  String code; // PK
  public int hashCode() {
    return code == null ? 17 : code.hashCode();
  }
  public boolean equals(Object o) {
    // Some obvious equals checking for type and field equality
  }
}

2 个答案:

答案 0 :(得分:3)

业务键代理键概念之间存在差异。通常,ID表示不可变的标识符(代理键),它没有商业含义。在数据库级别,相应的列将是主键,因此可以通过其他表中的外键引用它以确保参照完整性。模型ID的实体属性通常是Long类型。 它的值被赋值一次,永远不会改变。

业务键可以包含一个或多个实体属性(以及列),这些属性可以是可变的。

问题代码段中提供的字段code(应该是私有的)是商业密钥。因此,它可以根据需要进行更改。虽然实体类型缺少ID字段。

答案 1 :(得分:2)

这可能不是一个好主意。 (它表明您打算使用业务键(代码)作为对象的主键。如果您的进程要求您能够更改或重新分配密钥,这可能会导致复杂化。)

但是,它是否安全(至少在Hibernate情况下)取决于“代码”字段如何变异然后变异。如果在对象持久化之后更改对象的代码,则会破坏内存中和数据库中的副本之间的关系,并且会发生不好的事情。

另一个问题是,如果“代码”字段在对象位于HashMapHashSet时发生更改,则对象或条目可能会丢失。