Spring 数据 GemFire 唯一约束
Spring Data GemFire unique constraint
我正在使用 Spring Data GemFire 并像这样使用它:
存储库:
@Region("Token")
public interface TokenRepository extends GemfireRepository<Token, String> {}
实体:
public class Token implements Serializable {
@Id
private UUID id;
private String serial;
是否可以像 JPA @Column(unique=true)
一样在 serial
属性 上强制执行唯一性?充其量它应该在保存时抛出一个Exception
。
快速而简单的答案是否定的。 Spring Data GemFire 和 Pivotal GemFire(本身)都不支持对存储在区域中的对象实施唯一属性的能力。
即使在使用 JPA(例如 Hibernate)时,@Column(unique = true)
也是作为 RDMBS table 列(唯一性)约束实现的,因此 JPA 没有特别执行任何操作来强制执行唯一性。如果 RDBMS table 中不存在此列约束,则 Column(unique = true)
将 无 效果。
参见 。
这意味着需要在数据存储中强制执行唯一性,对于 Pivotal GemFire 尤其如此,因为...
Pivotal GemFire 是一个 key/value 存储,其中值是您的(整个)对象,存储在特定区域中的对象将在 GemFire 集群中分布和复制(用于 HA 场景中的冗余),这不仅会使强制唯一性变得非常困难,而且非常昂贵(例如,检查耗时)。
当然还有其他方法可以解决这个问题,例如为每个唯一 columns/properties 保留值哈希值的内存数据结构。但是,这会给内存带来压力,您还需要使数据结构保持最新。此外,根据所使用的哈希算法,它们并不总是保证严格唯一。
所以,这里真的没有很好的答案。
我正在使用 Spring Data GemFire 并像这样使用它:
存储库:
@Region("Token")
public interface TokenRepository extends GemfireRepository<Token, String> {}
实体:
public class Token implements Serializable {
@Id
private UUID id;
private String serial;
是否可以像 JPA @Column(unique=true)
一样在 serial
属性 上强制执行唯一性?充其量它应该在保存时抛出一个Exception
。
快速而简单的答案是否定的。 Spring Data GemFire 和 Pivotal GemFire(本身)都不支持对存储在区域中的对象实施唯一属性的能力。
即使在使用 JPA(例如 Hibernate)时,@Column(unique = true)
也是作为 RDMBS table 列(唯一性)约束实现的,因此 JPA 没有特别执行任何操作来强制执行唯一性。如果 RDBMS table 中不存在此列约束,则 Column(unique = true)
将 无 效果。
参见
这意味着需要在数据存储中强制执行唯一性,对于 Pivotal GemFire 尤其如此,因为...
Pivotal GemFire 是一个 key/value 存储,其中值是您的(整个)对象,存储在特定区域中的对象将在 GemFire 集群中分布和复制(用于 HA 场景中的冗余),这不仅会使强制唯一性变得非常困难,而且非常昂贵(例如,检查耗时)。
当然还有其他方法可以解决这个问题,例如为每个唯一 columns/properties 保留值哈希值的内存数据结构。但是,这会给内存带来压力,您还需要使数据结构保持最新。此外,根据所使用的哈希算法,它们并不总是保证严格唯一。
所以,这里真的没有很好的答案。