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 保留值哈希值的内存数据结构。但是,这会给内存带来压力,您还需要使数据结构保持最新。此外,根据所使用的哈希算法,它们并不总是保证严格唯一。

所以,这里真的没有很好的答案。