Hibernate: обеспечение уникальности SQL без ограничений - PullRequest
1 голос
/ 07 декабря 2011

Я занимаюсь разработкой приложения с использованием Hibernate.Одно из полей, которые я вставляю, должно быть уникальным в таблице.Проблема здесь заключается в том, что поле не является первичным ключом, а базовая база данных не поддерживает ограничения «УНИКАЛЬНО».Поэтому я должен применить это в своем коде приложения.

Этот псевдокод - это то, что у меня есть:

void insert(Data data) {

  beginTransaction();

  boolean exists = existsRecordWithName(data.name);

  // Line 7

  if (exists == false) {
    insertRecord(data);
  } else {
    display("Name already exists in database!");
  }

  commit();
}

Но если два разных процесса, куда вставлять данные одновременно,два достигли строки № 7, они подумали бы, что в базе данных нет другой записи с таким же именем, и они оба вставят ее -> результат будет дубликатом.

Так как я могу обеспечить уникальность таким образом?Если бы я использовал чистый SQL, я бы попытался заблокировать таблицу, но я искал решение более высокого уровня, включающее стандартные функции Hibernate, поэтому оно продолжало бы работать, если бы я когда-нибудь изменил бэкэнд.!

Ответы [ 2 ]

1 голос
/ 07 декабря 2011

Вы не можете применять уникальные ограничения, используя код приложения.Ограничения, строго говоря, распространяются на всех пользователей.То, что вы делаете в коде приложения, относится только к пользователям, которые случайно используют этот код приложения.Ограничения в коде приложения не применяются, например, для администраторов баз данных или разработчиков, которые используют инструмент командной строки или утилиту графического интерфейса для доступа к базе данных.

Сказав это, СУБД SQL обычно будет поддерживать блокировки и транзакции,Если вы не можете обеспечить уникальность, объявив столбец уникальным, ваша следующая лучшая ставка - явно заблокировать таблицу и, возможно, обернуть ваши изменения в сериализуемую транзакцию.Я думаю, что блокировки таблицы должно быть достаточно, но я не собираюсь делать ставки в системе, которая не поддерживает уникальные ограничения.

Какие базы данных не поддерживают уникальные ограничения?Я почти уверен, что никогда не видел ничего подобного, и я начал работать с базами данных почти 30 лет назад.

0 голосов
/ 07 декабря 2011

вы можете также выполнять блокировку, используя hibernate (LockMode), при условии, что ваша база данных поддерживает его, но блокировка с помощью вставок - сложная задача (как вы блокируете то, что еще не существует).Кстати, что произойдет, если вы сделаете unique = "true" для этой сущности?hibernate выдает ошибку, говоря, что не может или разрешает дублирование?Я предполагаю, что вы правильно реализовали методы equals и hashcode.

В приведенном выше наброске кода вы могли бы использовать intern () для имени и создать синхронизированный блок вокруг кода на имени - это может сработать.

...