我的spring jpa项目遇到一个奇怪的问题。基本上对于我的一个模型,外键似乎没有按预期工作。在我的项目中,我有一个模型类“ Player”和另一个“ PlayerStats”。
在“玩家统计”中,我添加了单个玩家的统计,并将其存储在我的数据库中。我将基本html用于简单的Web表单以进行数据输入。这可以正常工作,但列“ player_id”始终为NULL。这不会打扰我,但我想在另一个表中显示每个球员的个人统计信息,如果我不能解决这个问题,将可以查看其他所有球员的统计信息。
但是,我为项目中的不同模型类设置了相同的方法,我没有问题。例如,我有一个用户模型类,即“ user_id”被用作模型类“ Team”和“ Player”中的外键。在那里没有发现问题。因此,对于我要去哪里出错的任何帮助,我们深表感谢。
@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;
}
@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;
}
@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";
}
@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;
}
}
正如Sariq所说,您应该将Player设置为playerStats。
playerStats.setPlayer(player);
此外,我建议您在PlayerStats类中显式声明外键。为此,请使用@JoinColumn批注,并确保使用与数据库中相同的确切名称。
@ManyToOne
@JoinColumn(name = "player_id") // player_id has to match your foreign key in the database
private Player player;