Java Foreign Key只在Spring JPA项目中的一些模型上工作

Java Foreign Key只在Spring JPA项目中的一些模型上工作,java,mysql,spring,database,jpa,Java,Mysql,Spring,Database,Jpa,我的spring jpa项目遇到了一个奇怪的问题。基本上,对于我的一个模型,外键似乎没有按预期工作。 在我的项目中,我有一个模型级玩家和另一个玩家状态 playerStats.setPlayer(player); 在玩家统计中,我为单个玩家添加统计信息,并将其存储在我的数据库中。 我使用基本html作为简单的web表单进行数据输入。 这很好,但列player_id始终为空。 这不会打扰我,但我想在另一张表中显示每个球员的个人统计数据,如果我不能解决这个问题,其他所有球员的统计数据都可以查看 然

我的spring jpa项目遇到了一个奇怪的问题。基本上,对于我的一个模型,外键似乎没有按预期工作。 在我的项目中,我有一个模型级玩家和另一个玩家状态

playerStats.setPlayer(player);
在玩家统计中,我为单个玩家添加统计信息,并将其存储在我的数据库中。 我使用基本html作为简单的web表单进行数据输入。 这很好,但列player_id始终为空。 这不会打扰我,但我想在另一张表中显示每个球员的个人统计数据,如果我不能解决这个问题,其他所有球员的统计数据都可以查看

然而,我在我的项目中为不同的模型类设置了相同的方法,我没有任何问题。例如,我有一个用户模型类,它的user_id用作模型类Team和Player中的外键。没有问题。 因此,对于我在哪里出错的任何帮助,我们深表感谢

1.球员模型班 2.玩家状态模型 3.播放机状态控制器 4.用户模型
正如萨里克所说,你应该将玩家设置为玩家状态

playerStats.setPlayer(player);
我还建议在PlayerStats类中显式声明外键。通过使用@JoinColumn注释来实现,并确保使用数据库中的确切名称

@ManyToOne
@JoinColumn(name = "player_id") // player_id has to match your foreign key in the database
private Player player;

所以我明白了问题所在。@AuthenticationPrincipal批注导致了错误。我认为应该使用userDetailsService方法为用户获取数据。当我删除代码时,代码按预期工作。谢谢

对于玩家和玩家状态之间的双向映射,需要设置两个对象之间的链接。因此,在保存子对象PlayerStats之前,只需将Player的链接添加到其中。playerStats.setPlayerplayer;我本来就有那一行,并把它注释掉了,我重新添加了它,但仍然没有成功。也许我需要重建我的桌子?在我的其他模型中,我也不需要这一行代码,我已经添加了这一行,但它仍然没有填充数据库中的player_id列。当我调试时,我可以看到正在通过的播放器的id,但是它仍然不会传播到db。我也尝试过@JoinColumn方法,但仍然不起作用。尝试在@JoinColumn中添加nullable=false,看看它是如何工作的/可能会出现哪些异常。不,也不起作用。下面是我在下面的评论中读到的内容:playerStats.setPlayerplayer;//那么这似乎就是问题所在。您设置为PlayerStats的玩家实体为空,因此外键也为空。但除了显示player=null的位置外,还显示id=11,这是我添加统计数据的玩家的正确id。那么,为什么它拾取的是id而不是实际的玩家呢?我该如何改变它?
   @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;
    }
  }
playerStats.setPlayer(player);
@ManyToOne
@JoinColumn(name = "player_id") // player_id has to match your foreign key in the database
private Player player;