Использование @Transaction на уровне метода нарушает код, не сохраняя одну из сущностей - PullRequest
0 голосов
/ 09 мая 2020

Я новичок в гибернации JPA. Я очень благодарен за небольшую подсказку, почему это происходит. Я работаю с весенней загрузкой, спящим режимом и JPA, код работает нормально, если я не введу аннотацию @Transactional в один из моих методов.

@Override
@Transactional
public User createUser(User user, Set<UserRole> userRoles){
    User localUser = userRepository.findByUsername(user.getUsername());
    if(localUser != null) {
        //some check here....
    } else {
        for (UserRole ur : userRoles) {
            roleRepository.save(ur.getRole());
        }

        user.getUserRoles().addAll(userRoles);
        localUser = userRepository.save(user);
    }

    return localUser;
}

сопоставление в каждой сущности указано ниже: В пользовательской сущности:

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JsonIgnore
private Set<UserRole> userRoles = new HashSet<>();

В сущности роли:

@OneToMany(mappedBy = "role",cascade = CascadeType.ALL)
private Set<UserRole> userRoles = new HashSet<>();

и в сущности RoleUser:

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name="user_id")
private User user;

@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "role_id")
private Role role;

Сущности используют стандартный CrudRepository для сохранения. При введении аннотации @Transactional я получаю сообщение об ошибке "объект ссылается на несохраненный временный экземпляр - сохраните временный экземпляр перед очисткой: com.bookstore.bookstore.domain.security.UserRole.role -> com.bookstore.bookstore.domain. security.Role ".

При отладке я обнаружил, что при использовании @Transactional в методе createUser роль не сохраняется в БД (пока она сохраняется в БД, если не используется @Transactional). В результате, когда пользователь сохраняется, мы получаем вышеупомянутую ошибку, поскольку каскадная операция не выполняется для сохранения роли пользователя, но без использования аннотации @Transactional все работает нормально.

...