ManyToMany с CascadeType.ALL приводит к тому, что Отдельная сущность передается для сохранения - PullRequest
0 голосов
/ 13 февраля 2019

У меня много-много отношений с пользователями и ролями.Пользователь является владельцем отношений и имеет CascadeType.ALL.Когда я заполняю базу данных, я сначала создаю пользователей, создаю роли и назначаю роли пользователям.После этого я сохраняю всех пользователей в репозитории.

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

Пользователь:

@Entity
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Long id;

@ManyToMany(cascade = CascadeType.ALL)
@JoinTable(
        name = "users_roles",
        joinColumns = @JoinColumn(
                name = "user_id", referencedColumnName = "id"),
        inverseJoinColumns = @JoinColumn(
                name = "role_id", referencedColumnName = "id"))
private List<Role> roles;   

Роль:

@Entity
public class Role {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

@JsonIgnore
@ManyToMany
private List<User> users;

Код, используемый для заполнения базы данных:

        User user1= new User();
        User user2= new User();

        Role role1 = new Role();
        Role role2 = new Role();

        user1.addRole(role1);
        user2.addRole(role1);
        user2.addRole(role2);

        role1.addUser(user1);
        role1.addUser(user2);
        role2.addUser(user2);

        userRepository.save(user1);
        userRepository.save(user2);

Любая помощьпризнателен!

РЕДАКТИРОВАТЬ: Я обнаружил, что проблема возникает только тогда, когда я добавляю несколько ролей для одного и того же пользователя и обновил код.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Ваш Каскадирование здесь неверно. Наличие Cascade.ALL в коллекции «многие ко многим» не имеет смысла именно потому, что вы можете иметь Роли, которые являются общими для пользователей.

Что такое спящий режимпытаюсь сказать вам, что у вас уже есть роль, с которой связан ID, и вы пытаетесь вызвать persist для той же роли.

Вам необходимо выяснить, как управлять своими ролями.У вас есть два варианта:

  1. Удалить каскад.
  2. Переназначить управляемые роли вашему user2, чтобы вы не использовали отдельную.

Лично я бы удалил Cascade.ALL.ИМО это неправильно.

0 голосов
/ 13 февраля 2019

Этот пример работает для меня, там нет исключений.Пожалуйста, поделитесь дополнительной информацией: версия спящего режима, база данных и фактический код, который вы используете.

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