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, что не только сделает принудительное применение уникальности очень сложно, но и очень дорого (например, проверка занимает много времени).
Конечно, есть и другие способы справиться с этим, такие как сохранение структуры данных в памяти хэшей значений для каждого из уникальных столбцов / свойств. Но это оказывает давление на память, и вам также необходимо поддерживать структуру данных в актуальном состоянии. Кроме того, в зависимости от используемого алгоритма хеширования, они не всегда гарантированно являются строго уникальными.
Таким образом, здесь действительно нет хорошего ответа.