Hibernate не выдает исключение на дубликате первичного ключа - PullRequest
0 голосов
/ 04 октября 2018

Я работаю с 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)

1 Ответ

0 голосов
/ 04 октября 2018

Если вы посмотрите на реализацию метода сохранения, это выглядит так:

@Transactional
public <S extends T> S save(S entity) {

    if (entityInformation.isNew(entity)) {
        em.persist(entity);
        return entity;
    } else {
        return em.merge(entity);
    }
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...