Не работайте update () в HibernateRepository после подтверждения пользователем токена без Spring Boot - PullRequest
0 голосов
/ 07 апреля 2020

Контроллер:

@Controller
@RequestMapping("/token")
public class ConfirmController {

private final UserService userService;

public ConfirmController(UserService userService) {
    this.userService = userService;
}

//FIXME: method update() doesn't work right because confirm() method doesn't work in one session!
//FIXME: also need to look at the correct implementation of user (User.class) relationships and roles (Role.class)

@GetMapping("/{token}")
public String checkToken(@PathVariable("token") String token){
    if (userService.confirm(token)) {
        return "developers";
    }
    return "/signIn";
}

}

Сервис:

@Service
@Slf4j
public class UserServiceImpl implements UserService {

private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;

@Autowired
public UserServiceImpl(PasswordEncoder passwordEncoder, @Qualifier("hibernateUserRepositoryImpl") 
UserRepository userRepository) {
    this.passwordEncoder = passwordEncoder;
    this.userRepository = userRepository;
}

@Override
public boolean confirm(String token) {
    User user = findByToken(token);
    if (user != null) {
        user.setStatus(Status.ACTIVE);
        userRepository.update(user);
        return true;
    } else {
        return false;
    }
}

Репозиторий:

@Component
public class HibernateUserRepositoryImpl implements UserRepository {

private SessionFactory sessionFactory;

private Session currentSession(){
    return sessionFactory.openSession();
}

@Autowired
public HibernateUserRepositoryImpl(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

private SessionFactory sessionFactory;

private Session currentSession(){
    return sessionFactory.openSession();
}

@Override
public void update(User entity) {
    currentSession().update(entity);
}

@Override
public void update(String email, Status status){
    Query query = currentSession().createQuery("update User set status = :status"+
            " where email = :email");
    query.setParameter("status", status.toString());
    query.setParameter("email", email);
    query.executeUpdate();
}

@Override
public User findByToken(String token) {
    Query<User> q = currentSession().
            createQuery("from User where token = :token", User.class);
    q.setParameter("token", token);
    return q.list().stream().findAny().orElse(null);
}

Модели:

@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "itis_user")
public class User extends BaseEntity implements Serializable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String nickname;
private String email;
private String password;

//FIXME: For table user_roles doesn't implement method save()

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "user_roles",
        joinColumns = {@JoinColumn(name = "user_id", referencedColumnName = "id")},
        inverseJoinColumns = {@JoinColumn(name = "role_id", referencedColumnName = "id")})
private List<Role> roles;

@Column(length = 500)
private String token;

}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "roles")
public class Role extends BaseEntity {

@Column(name = "name")
private String name;

@ManyToMany(mappedBy = "roles", fetch = FetchType.LAZY)
private List<User> users;

@Override
public String toString() {
    return "Role{" +
            "id: " + super.getId() + ',' +
            "name: " + name + '}';
}

}

Репозиторий в GitHub: https://github.com/BulHub/BulSchool

PS Я не могу использовать Spring Boot.

Если я использую 'void update (User entity)':

org.hibernate.HibernateException: недопустимая попытка связать коллекцию с двумя открытыми сеансами. Коллекция: [ru.itis.models.User.roles # 11] Содержание коллекции: [[]]

Не знаю, что делать? Помогите мне, пожалуйста.

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