Foreign Key仅在Spring JPA项目中的某些模型上起作用

问题描述 投票:0回答:1

我的spring jpa项目遇到一个奇怪的问题。基本上对于我的一个模型,外键似乎没有按预期工作。在我的项目中,我有一个模型类“ Player”和另一个“ PlayerStats”。

在“玩家统计”中,我添加了单个玩家的统计,并将其存储在我的数据库中。我将基本html用于简单的Web表单以进行数据输入。这可以正常工作,但列“ 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;
    }
  }
java mysql spring database jpa
1个回答
0
投票

正如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;
© www.soinside.com 2019 - 2024. All rights reserved.