Foreign Key работает только над некоторыми моделями в проекте Spring JPA - PullRequest
0 голосов
/ 08 марта 2020

У меня возникла странная проблема с моим весенним проектом 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;
    }
  }

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Как сказал Сарик, вы должны установить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;
0 голосов
/ 09 марта 2020

Итак, я понял, в чем проблема. Аннотация @AuthenticationPrincipal была причиной ошибки. Я считаю, что следует использовать для получения данных для пользователя, используя метод userDetailsService. Когда я удалил это код работал как ожидалось. Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...