Уникальные ограничения на столбцы TEXT в JPA с использованием MySQL InnoDB - PullRequest
2 голосов
/ 15 сентября 2011

Нам нужно сохранить длинную строку UTF-8 в базе данных MySQL, которая должна быть проверена на уникальность. Это текущая конфигурация:

@Column(unique = true,length = 8000,columnDefinition="TEXT")
private String text;

, но поскольку MySQL требуется указать префикс индекса для полей BLOB и TEXT, произойдет сбой со следующей ошибкой:

BLOB/TEXT column 'path' used in key specification without a key length

Как правильно настроить сопоставление ORM для поддержки такого варианта использования?

1 Ответ

3 голосов
/ 18 октября 2011

Рассматривали ли вы вычисление значения хеш-функции для вашей текстовой строки ?Затем вы можете сохранить хеш-значение и просто проверить уникальность хеш-значения.Любые коллизии, которые вы получаете со значением хеш-функции, затем проверяют фактические текстовые строки.Если они отличаются, вы включаете значение последовательности.если нет, то вы нашли свою ошибку.Таким образом, ваша таблица

Hash, Sequence (уникальна в пределах того же значения Hash), TextString

, а ваш уникальный индекс

Hash, Sequence

Для проверки уникальности вычислите значение Hash и попытайтесь сохранить его с нулевой последовательностью.Если вы не можете сохранить его в нулевой последовательности, сравните текстовую строку в нулевой последовательности.Если они одинаковые, вы нашли дубликат текста.Если они отличаются, попытайтесь сохранить их в последовательности 1. Повторяйте, пока не найдете повторяющуюся текстовую строку с этим порядковым номером или не сохраните ее в базе данных со следующим доступным порядковым номером.

Хитростьвычисляет алгоритм хэширования, который не дает вам много дубликатов и может обрабатывать длинную текстовую строку.Еще лучше был бы отличный ORM, который мог бы сделать это для вас.

...