Как вставить только в таблицу соединений, но не в справочную таблицу в jpa hibernate

У меня есть две сущности User и Role. У пользователя может быть несколько ролей, и каждая роль может быть связана с несколькими пользователями. то есть, роль пользователя имеет отношение "многие-многие"

например: пользователи ОЗУ, Роб и Джон являются администраторами

Я создаю таблицу соединения между пользователем и ролью для хранения информации.

@Entity
@Table(name = "account")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Account {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "user_id")
    private int id;

    @Column(unique = true)
    private String username;

    @Transient
    @JsonIgnore
    private String password;

    @ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.)
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    @Column
    private boolean deleted;

}

И Role.java

@Entity
@Table(name = "role")
@Data
public class Role {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="role_id")
    private int id;
    @Column(name="role",unique=true)
    private String role;

}

Когда это выполняется при весенней загрузке, создаются следующие таблицы: account, user_role, role.

Поскольку количество моих ролей фиксировано. Я вставил их вручную

INSERT INTO `role` VALUES (1,'ADMIN');
INSERT INTO `role` VALUES (2,'USER');

Теперь из моего приложения загрузки java spring я пытаюсь вставить новую запись в таблицу учетных записей. Сделана попытка вставить новую запись в таблицу Role ... Я хочу вставить ее только в таблицы account и user_role, но не в таблицу role ...

Может ли кто-нибудь сообщить мне, как это сделать?

ОБНОВИТЬ:

вот часть вставки учетной записи (создать часть кода учетной записи)

//Создать учетную запись

public Account createAccount(AccountDto account) {

        Account newAccount = new Account();
        newAccount.setPassword(account.getPassword());
        newAccount.setUsername(account.getUsername());
        Set<Role> roles = new HashSet<Role>();
        Role role = new Role();
        role.setRole(account.getRole());
        roles.add(role);
        newAccount.setRoles(roles);
        Account savedAccount = save(newAccount);
        return savedAccount;
    }

// Обновить аккаунт

public Account updateAccount(String oldUserName, AccountDto accountDto) {
        Account account = accountRepository.findByUsername(oldUserName);
        if (account != null) {
            Set<Role> roleset = new HashSet<Role>();
            if(accountDto.getRole() != null && !accountDto.getRole().isEmpty()){
                Role role = roleRepository.findByRole(accountDto.getRole());
                if (role == null) {
                    roleset.add(role);
                }
            }
            account.setRoles(roleset);
            account.setUsername(accountDto.getUsername());
            account = accountRepository.save(account);
            return account;
        } else
            return null;
    }

Ваш код «вставить новую запись в таблицу счетов» может быть полезен. Я думаю, вы пытаетесь вставить нового пользователя, установив его роль на new Role() вместо того, чтобы сначала получить роль от db.

Kamil Noster 10.08.2018 16:29
«Я пытаюсь вставить новую запись в таблицу счетов» ... Как? У вас есть код, которым вы можете поделиться с нами?
lealceldeiro 10.08.2018 16:33

добавлен @KamilNoster с вставкой и обновлением фрагмента кода

stallion 10.08.2018 17:26

@lealceldeiro добавил код

stallion 10.08.2018 17:26

@stallion Я не уверен, как вы пытаетесь обновить учетную запись. Какая здесь роль accountDto? должен ли он привнести роли, которые должны быть установлены на account, или это просто объект доступа к данным, который извлекается из базы данных, какого-то репозитория?

lealceldeiro 10.08.2018 17:46

accountDto должен взаимодействовать с пользовательским интерфейсом, чтобы получать только некоторую информацию. Я не хочу, чтобы они устанавливали «набор ролей», а устанавливали только одно значение для роли .. Также я не хочу устанавливать удаленное поле учетной записи .. поэтому accountDto является подмножеством учетной записи .. Я думаю, что в данном случае это не имеет значения.

stallion 10.08.2018 17:58
3
6
2 080
1

Ответы 1

Попробуйте дополнить CascadeType в классе Account.

@ManyToMany(fetch = FetchType.EAGER,cascade = CascadeType.)

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

@ManyToMany(fetch = FetchType.EAGER,
        cascade = {
            CascadeType.PERSIST,
            CascadeType.MERGE
        },
        mappedBy = "role")
private Set<Account> accounts = new Set<Account>();

Вы можете найти хороший учебник здесь https://www.callicoder.com/hibernate-spring-boot-jpa-many-to-many-mapping-example/

Я получаю это исключение: вызвано: org.hibernate.PersistentObjectException: отсоединенный объект передан для сохранения: com.techjava.springbootsecuritymysql.model.Role

stallion 13.08.2018 01:09

Другие вопросы по теме