Итак, я убираю свой маленький проект Spring и по какой-то причине заметил, что аннотация @OneToOne не выполняет для меня свою работу, что, в свою очередь, вызывает проблемы в другой модели.
ссылка на github: https://github.com/eamonmckelvey/sports-app
По сути, у меня есть класс модели User, класс модели команды и класс модели игрока. Я хочу, чтобы только один пользователь мог создать одну команду, а одна команда должна иметь много игроков. Тем не менее, я могу добавить столько команд своему пользователю, сколько захочу, что неверно.
Все ответы требуют от меня добавления конструктора no arg и конструктора для моего класса пользователей, но когда я это делаю это я получаю сообщение об ошибке при регистрации в классе.
Пожалуйста, помогите.
1. Модель пользователя
@Entity
@Data
@NoArgsConstructor(access= AccessLevel.PRIVATE, force=true)
@RequiredArgsConstructor
public class User implements UserDetails {
@OneToOne(cascade = CascadeType.ALL,mappedBy = "user")
private Team team;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private final String username;
private final String password;
//private final String fullname;
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return Arrays.asList(new SimpleGrantedAuthority("ROLE_USER"));
}
@Override
public boolean isAccountNonExpired() {
return true;
}
@Override
public boolean isAccountNonLocked() {
return true;
}
@Override
public boolean isCredentialsNonExpired() {
return true;
}
@Override
public boolean isEnabled() {
return true;
}
}
2. Модель команды
@Data
@Entity
@Table(name="User_Team")
public class Team implements Serializable {
@OneToOne(fetch= FetchType.LAZY)
private User user;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
//@NotBlank(message="Team Name is required")
private String teamName;
//@NotBlank(message="Location is required")
private String location;
//@NotBlank(message="Nickname required")
private String nickName;
private String yearEstablished;
public Sport sport;
private Divison divison;
3. Командный контроллер
@Slf4j
@Controller
@SessionAttributes("Team")
public class TeamController {
private TeamRepository teamRepository;
public TeamController(TeamRepository teamRepository) {
this.teamRepository = teamRepository;
}
@Autowired
TeamRepository service;
@GetMapping("/team")
public String displayTeam(Model model) {
model.addAttribute("team", service.findAll());
return "/team";
}
@GetMapping("/addTeam")
public String showSignUpForm(User user) {
return "addTeam";
}
@PostMapping("/addTeam")
public String processOrder(@Valid Team team, BindingResult result, SessionStatus
sessionStatus,
@AuthenticationPrincipal User user, Model model) {
if (result.hasErrors()) {
return "addTeam";
}
team.setUser(user);
service.save(team);
model.addAttribute("team", service.findAll());
return "team";
}
4. Форма регистрации
@Data
public class RegistrationForm {
private String username;
private String password;
//private String fullname;
public User toUser(PasswordEncoder passwordEncoder) {
return new User(
username, passwordEncoder.encode(password));
}
}
5. Контроллер регистрации
@Controller
@RequestMapping("/register")
public class RegistrationController {
private UserRepository userRepo;
private PasswordEncoder passwordEncoder;
public RegistrationController( UserRepository userRepo,
PasswordEncoder passwordEncoder){
this.userRepo = userRepo;
this.passwordEncoder = passwordEncoder;
}
@GetMapping
public String registerForm(){
return "registration";
}
@PostMapping
public String processRegistration(RegistrationForm form){
userRepo.save(form.toUser(passwordEncoder));
return "redirect:/login";
}
6. класс данных пользователя
@Service
public class UserRepositoryUserDetailsService implements
UserDetailsService {
private UserRepository userRepo;
@Autowired
public UserRepositoryUserDetailsService(UserRepository userRepo) {
this.userRepo = userRepo;
}
@Override
public UserDetails loadUserByUsername(String username) throws
UsernameNotFoundException {
User user = userRepo.findByUsername(username);
if (user != null) {
return user;
}
throw new UsernameNotFoundException(
"User '" + username + "' not found");
}