У меня возникла странная проблема с моим весенним проектом jpa. Похоже, что для одной из моих моделей внешний ключ работает не так, как предполагалось. В моем проекте у меня есть класс модели "Player" и еще один "PlayerStats".
В "Player Stats" я добавляю статистику для отдельного игрока и сохраняю ее в своей базе данных. Я использую basi c html для простой веб-формы для ввода данных. Это работает нормально, но столбец "player_id" всегда NULL. Это не будет беспокоить меня, но я хотел бы отобразить индивидуальные характеристики для каждого игрока в другой таблице, и если я не смогу это исправить, статистика всех остальных игроков будет доступна для просмотра.
Однако я настроил ее таким же образом для разных моделей классов в моем проекте, и у меня нет проблем. Например, у меня есть пользовательский класс модели, который «user_id» используется в качестве внешнего ключа в модельном классе «Team» и «Player». Никаких проблем там не было. Поэтому любая помощь в том, где я иду не так, очень ценится.
1. Класс модели игрока
@Data
@Entity
@Table(name="User_Player")
public class Player implements Serializable {
@OneToOne
private User user;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private String playerName;
private String dob;
private String hometown;
private String weight;
private String height;
private Position position;
}
2. Модель PlayerStats
@Data
@Entity
@Table(name="Player_Stats")
public class PlayerStats implements Serializable {
@ManyToOne
private Player player;
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy= GenerationType.AUTO)
private Long id;
private int td;
private int rushYards;
private int recYards;
private int returnYards;
private int throwingYards;
private int throwAttenpts;
private int throwSuccess;
private int receptions;
private int rushTD;
private int recTD;
private int fumbles;
private int fumblesRecovered;
private int forcedFumbles;
private int sacks;
private int puntsBlocked;
private int fgScored;
private int fgMissed;
private int punts;
private int tackle;
public Opponents opponents;
}
3. Контроллер PlayerStats
@Slf4j
@Controller
@SessionAttributes("PlayerStats")
public class PlayerStatsController {
private PlayerStatsRepository playerStatsRepository;
public PlayerStatsController(PlayerStatsRepository playerStatsRepository)
{this.playerStatsRepository = playerStatsRepository;}
@Autowired
PlayerStatsRepository service;
@GetMapping("/addPlayerStats/{id}")
public String showSignUpFormPlayer(Player player) {
return "addPlayerStats";
}
@PostMapping("/addPlayerStats/{id}")
public String processPlayer(@Valid PlayerStats playerStats, BindingResult result,
SessionStatus sessionStatus,
@AuthenticationPrincipal Player player, Model model) {
if (result.hasErrors()) {
return "playerStats";
}
//playerStats.setPl(player);
service.save(playerStats);
model.addAttribute("playerStats", service.findAll());
return "login";
}
4. Модель пользователя
@Entity
@Data
@NoArgsConstructor(access= AccessLevel.PRIVATE, force=true)
@RequiredArgsConstructor
public class User implements UserDetails {
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;
}
}