Контроллер:
@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] Содержание коллекции: [[]]
Не знаю, что делать? Помогите мне, пожалуйста.