Spring JPA Hibernate многократная вставка дубликат записи для первичного ключа - PullRequest
1 голос
/ 29 февраля 2020
    2020-02-29 13:01:14.008 DEBUG 5200 --- [nio-8083-exec-2] org.hibernate.SQL                        : insert into users_roles (role_id, user_id) values (?, ?)
2020-02-29 13:01:14.009 TRACE 5200 --- [nio-8083-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [INTEGER] - [2]
2020-02-29 13:01:14.009 TRACE 5200 --- [nio-8083-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [BIGINT] - [5]
2020-02-29 13:01:14.010 DEBUG 5200 --- [nio-8083-exec-2] org.hibernate.SQL                        : insert into users_roles (user_id, role_id) values (?, ?)
2020-02-29 13:01:14.010 TRACE 5200 --- [nio-8083-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [1] as [BIGINT] - [5]
2020-02-29 13:01:14.010 TRACE 5200 --- [nio-8083-exec-2] o.h.type.descriptor.sql.BasicBinder      : binding parameter [2] as [INTEGER] - [2]
2020-02-29 13:01:14.025  WARN 5200 --- [nio-8083-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1062, SQLState: 23000
2020-02-29 13:01:14.025 ERROR 5200 --- [nio-8083-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : Duplicate entry '5-2' for key 'PRIMARY'
2020-02-29 13:01:14.027  INFO 5200 --- [nio-8083-exec-2] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements
2020-02-29 13:01:14.072  WARN 5200 --- [nio-8083-exec-2] .m.m.a.ExceptionHandlerExceptionResolver : Resolved [org.springframework.dao.DataIntegrityViolationException: could not execute statement; SQL [n/a]; constraint [PRIMARY]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement]

Список полномочий внутри сущности USER

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.EAGER)
@JoinTable(name = "users_roles",
        joinColumns = @JoinColumn(name = "user_id"),
        inverseJoinColumns = @JoinColumn(name = "role_id"))
@JsonIgnore
private Set<Authority> authorities = new HashSet<>();

Пользователи Список внутри сущности полномочий

@ManyToMany(cascade = { CascadeType.MERGE, CascadeType.DETACH, CascadeType.REFRESH}, fetch = FetchType.LAZY)
@JoinTable(name = "users_roles",
        joinColumns = @JoinColumn(name = "role_id"),
        inverseJoinColumns = @JoinColumn(name = "user_id"))
private Set<User> users = new HashSet<>();

Я понимаю, что когда я сохраняю сущность USER, сущность AUTHORITY внутри также получает сохранено, что опять-таки спасает сущность ПОЛЬЗОВАТЕЛЯ и вот что вызывает неприятности. Как я могу обойти это? Заранее спасибо!

1 Ответ

1 голос
/ 29 февраля 2020

Проблема, с которой вы, вероятно, сталкиваетесь, заключается в том, что, поскольку у вас есть объявление @JoinTable для обоих объектов, то есть у вас есть две вставки с одинаковыми составными первичными ключами в Join Table. Вы можете просто удалить аннотацию из класса Authority к этому:

@ManyToMany(mappedBy="authorities")
private Set<User> users = new HashSet<>();

Оставьте все остальное таким же. Надеюсь, это сработает.

...