Java 使用Hibernate和Ehcache时可变ID安全吗?

Java 使用Hibernate和Ehcache时可变ID安全吗?,java,hibernate,ehcache,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

在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
  }
}

业务密钥和代理密钥概念之间存在差异。通常,ID表示一个不可变的标识符(代理键),它没有业务意义。在数据库级别,对应的列将是主键,因此它可以被其他表中的外键引用,以确保引用完整性。模型ID通常为Long类型的实体属性。 它的值只指定一次,从不更改

业务密钥可以由一个或多个实体属性(以及列)组成,这些属性可以是可变的


问题片段中提供的提示表明,
code
(应该是私有的)字段是业务密钥。因此,可以根据需要进行更改。尽管实体类型缺少ID字段。

但业务密钥和代理密钥概念之间存在差异。通常,ID表示一个不可变的标识符(代理键),它没有业务意义。在数据库级别,对应的列将是主键,因此它可以被其他表中的外键引用,以确保引用完整性。模型ID通常为Long类型的实体属性。 它的值只指定一次,从不更改

业务密钥可以由一个或多个实体属性(以及列)组成,这些属性可以是可变的


问题片段中提供的提示表明,
code
(应该是私有的)字段是业务密钥。因此,可以根据需要进行更改。尽管实体类型缺少ID字段。

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

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


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

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

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

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