Java Spring数据唯一约束
我正在使用Spring Data GemFire并使用它,如下所示: 存储库:Java Spring数据唯一约束,java,spring,spring-data-gemfire,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; 是否可以像JPAs@Column(
@Region("Token")
public interface TokenRepository extends GemfireRepository<Token, String> {}
public class Token implements Serializable {
@Id
private UUID id;
private String serial;
是否可以像JPAs
@Column(unique=true)
那样,在串行
属性上强制唯一性?充其量,它应该在保存时抛出一个异常。快速而简单的答案是否定的。Spring数据GemFire和Pivotal GemFire(本身)都不支持对存储在区域中的对象强制执行唯一属性的能力
即使在使用JPA(例如Hibernate)时,@Column(unique=true)
也被实现为RDMBS表列(university)约束,因此JPA没有特别做什么来强制唯一性。如果RDBMS表中不存在此列约束,则列(unique=true)
将产生无效果
看
这意味着需要在数据存储中强制执行唯一性,这对于Pivotal GemFire尤其如此,因为
Pivotal GemFire是一个键/值存储,其中值是您的(整个)对象,存储在特定区域的对象将在GemFire集群中分布和复制(用于HA场景中的冗余),这不仅使强制执行唯一性非常困难,而且非常昂贵(例如,检查耗时)
当然还有其他方法来处理这个问题,比如为每个唯一的列/属性保留一个内存中的值哈希数据结构。但是,这会给内存带来压力,您还需要保持数据结构的最新状态。此外,根据使用的哈希算法,它们并不总是严格唯一的
所以,这里真的没有一个好的答案。您能告诉我们更多关于为什么您希望序列号是唯一的吗?你有没有想过用Id和序列号组合你的Id?这只是一个小例子,我知道我可以简单地使用序列号作为Id。但是我会有多个属性,它们本身需要是唯一的,所以组合的Id不起作用。