Привязать два поля Hibernate как уникальные.

 
 
 
Сообщения:4
Здравствуйте, ребята.
Подскажите пожалуйста, как связать два поля из таблицы, чтобы их совокупность была уникальна.
то есть, например если есть запись в таблице Имя: Иван Фамилия Иванов, то Иван Сергеев можно будет, и Сергей Иванов можно,но Иван Иванов уже нельзя.
Сделал так, но никаго экцепшена не случается
@Entity
@Table(name="Users",uniqueConstraints=
@UniqueConstraint(columnNames={"name", "surname"}))
public class UsersEntity implements Serializable{

то есть name и surname должны быть как уникальные. Однако смотрю через phpmyAdmin и вижу две записи в этих двух полях одинаковые
записи.
Что делается неправильно, подскажите пожалуйста.
 
 
Сообщения:9996
Таблицы, constraint'ы, индексы - это все нужно конфигурировать в БД а не в Hibernate. Да, Hibernate может сгенерировать это все если его попросить, однако у него много ограничений и на практике так никто не делает. Нужно самому написать SQL который создаст таблицы и правильно их настроит. В Java чаще всего такой SQL запускается при старте приложения с помощью таких инструментов как Liquibase, Flyway.
 
 
Сообщения:4
Но ведь hibernate должен же хотябы бросить исключение, если поля одинаковые. Зачем тогда @Table(name="Users",uniqueConstraints=
@UniqueConstraint(columnNames={"name", "surname"}))

Констранты есть, но гибернет просто тупо пишет в базу, даже не возмущается. Может я неправильно это оформил как-то?
гибернет перед записью способен проверить все поля, чтобы они соотвествовали требованиям, прежде
чем делать транзакцию? Или он не проверяет? Тогда вопрос зачем вообще констранты нужны если от них толка ноль. Пусть уже
база делает экспепшен, а гибернет расскажет об этом.
 
 
Сообщения:9996
saggitarius:
Но ведь hibernate должен же хотябы бросить исключение, если поля одинаковые
Ну и как по-твоему он это сделает? Будет поиск по этим полям делать? Это было бы слишком медленно. И все равно не надежно потому как не атомарно.

Ошибки бросают констрейнты на уровне БД. Эта аннотация лишь для того чтоб Hibernate создал этот unique constraint в базе. Для этого нужно ему указать hbm2ddl=update. Но, повторюсь, так никто не делает.
Изменен:20 апр 2020 20:49
 
 
Сообщения:4
ну чтож ладно. Сделаем в базе ограничения. Спасибо за ответы.
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет