在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
}
}
答案 0 :(得分:3)
业务键和代理键概念之间存在差异。通常,ID表示不可变的标识符(代理键),它没有商业含义。在数据库级别,相应的列将是主键,因此可以通过其他表中的外键引用它以确保参照完整性。模型ID的实体属性通常是Long类型。 它的值被赋值一次,永远不会改变。
业务键可以包含一个或多个实体属性(以及列),这些属性可以是可变的。
问题代码段中提供的字段code
(应该是私有的)是商业密钥。因此,它可以根据需要进行更改。虽然实体类型缺少ID字段。
答案 1 :(得分:2)
这可能不是一个好主意。 (它表明您打算使用业务键(代码)作为对象的主键。如果您的进程要求您能够更改或重新分配密钥,这可能会导致复杂化。)
但是,它是否安全(至少在Hibernate情况下)取决于“代码”字段如何变异然后变异。如果在对象持久化之后更改对象的代码,则会破坏内存中和数据库中的副本之间的关系,并且会发生不好的事情。
另一个问题是,如果“代码”字段在对象位于HashMap
或HashSet
时发生更改,则对象或条目可能会丢失。