Я работаю с Spring Data JPA.При такой настройке:
@Entity
public class Role
{
@Id
@Column(nullable = false, unique = true)
private String name;
@Column
private String info;
}
@Repository
public interface RoleRepository extends CrudRepository<Role, String>
{
}
Я могу просто вставить Role
с одним и тем же первичным ключом (name
) дважды.Это просто обновляет запись в базе данных.Я хотел бы, чтобы это бросило исключение все же.Попытка вставить две записи с одним и тем же первичным ключом на уровне базы данных приводит к желаемому «дублирующему ключу» - ошибка.
Пример:
Таблица ролей пуста
MariaDB [logz]> select * from role;
Empty set (0.00 sec)
Сохранение в первый раз
roleRepository.save(new Role("name1", "info0"));
Сначала проверка гибернации, затем сохранение
Hibernate: select role0_.name as name1_3_0_, role0_.info as info2_3_0_ from role role0_ where role0_.name=?
Hibernate: insert into role (info, name) values (?, ?)
Таблица ролей заполнена
MariaDB [logz]> select * from role;
+-------+-------+
| name | info |
+-------+-------+
| name1 | info0 |
+-------+-------+
1 row in set (0.00 sec)
Сохранение во второй раз
roleRepository.save(new Role("name1", "info1"));
Проверка и обновление Hibernate - хотя я хочу исключение здесь!
Hibernate: select role0_.name as name1_3_0_, role0_.info as info2_3_0_ from role role0_ where role0_.name=?
Hibernate: update role set info=? where name=?
Рольтаблица просто обновляется: (
MariaDB [logz]> select * from role;
+-------+-------+
| name | info |
+-------+-------+
| name1 | info1 |
+-------+-------+
1 row in set (0.00 sec)