Я новичок в гибернации 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 все работает нормально.