Spring Data GemFire的唯一约束

时间:2017-11-15 13:12:06

标签: java spring spring-data-gemfire

我正在使用 Spring Data GemFire 并使用它:

存储库:

@Region("Token")
public interface TokenRepository extends GemfireRepository<Token, String> {}

实体:

public class Token implements Serializable {

@Id
private UUID id;
private String serial;

是否可以在serial属性上强制实施唯一性,例如JPA @Column(unique=true)?最好它应该在保存时抛出Exception

1 个答案:

答案 0 :(得分:1)

快速而简单的答案是否定的。 Spring Data GemFire 和Pivotal GemFire(本身)都不支持对存储在Region中的对象强制执行唯一属性的功能。

即使使用JPA(例如Hibernate),@Column(unique = true)也是作为RDMBS表列(唯一性)约束实现的,因此JPA特别没有采取任何措施来强制实现唯一性。如果RDBMS表中没有此列约束,则Column(unique = true)将具有效果。

请参阅here

这意味着需要在数据存储中强制执行唯一性,对于Pivotal GemFire来说尤其如此,因为......

Pivotal GemFire是一个键/值存储,其中值是您的(整个)对象,并且存储在特定Region中的对象将在GemFire集群中进行分发和复制(以便在HA场景中实现冗余),这不仅会使强制执行唯一性非常困难,但也非常昂贵(例如检查耗时)。

当然还有其他方法可以解决这个问题,例如为每个唯一的列/属性保留值哈希值的内存数据结构。但是,这会给内存带来压力,您还需要保持数据结构的最新状态。此外,根据所使用的哈希算法,它们并不总是保证是严格唯一的。

所以,这里确实没有一个好的答案。