我正在使用 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
。
答案 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场景中实现冗余),这不仅会使强制执行唯一性非常困难,但也非常昂贵(例如检查耗时)。
当然还有其他方法可以解决这个问题,例如为每个唯一的列/属性保留值哈希值的内存数据结构。但是,这会给内存带来压力,您还需要保持数据结构的最新状态。此外,根据所使用的哈希算法,它们并不总是保证是严格唯一的。
所以,这里确实没有一个好的答案。