Spring Data GemFire ​​уникальное ограничение

Я работаю с Spring Data GemFire и использую его следующим образом:

Repository:

@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 ответ

Решение

Быстрый и простой ответ - НЕТ. Ни Spring Data GemFire, ни Pivotal GemFire ​​(сам по себе) не поддерживают возможность применения уникальных свойств для объектов, хранящихся в Регионе.

Даже при использовании JPA (например, Hibernate), @Column(unique = true) реализован в виде ограничения столбца (уникальности) таблицы RDMBS, поэтому JPA, в частности, ничего не делает для обеспечения уникальности. Если это ограничение столбца не присутствовало в таблице RDBMS, то Column(unique = true) не будет иметь никакого эффекта.

Смотрите здесь.

Это означает, что уникальность должна быть обеспечена в хранилище данных, что было бы особенно верно для Pivotal GemFire, так как...

Pivotal GemFire ​​- это хранилище ключей / значений, в котором значением является ваш (весь) объект, а объекты, хранящиеся в определенном регионе, будут распределены и реплицированы (для избыточности в сценариях HA) по кластеру GemFire, что не только сделает принудительное применение уникальности очень сложно, но и очень дорого (например, проверка занимает много времени).

Конечно, есть и другие способы справиться с этим, такие как сохранение структуры данных в памяти хэшей значений для каждого из уникальных столбцов / свойств. Но это оказывает давление на память, и вам также необходимо поддерживать структуру данных в актуальном состоянии. Кроме того, в зависимости от используемого алгоритма хеширования, они не всегда гарантированно являются строго уникальными.

Таким образом, здесь действительно нет хорошего ответа.

Другие вопросы по тегам