Hibernate двунаправленное отношение один ко многим, добавление элемента - PullRequest
0 голосов
/ 18 мая 2018

У меня проблема с двунаправленным отношением один ко многим.У меня проблема с добавлением элемента B (многие) в A (один).Я пытаюсь добавить новый элемент в сущности.Вот моя схема БД: Схема БД

Вот моя сущность А:

public class Application {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int Id;

@Column(name = "has_paid")
private boolean paid;

@Column(name = "is_accepted")
private boolean accepted;

@OneToOne
@JoinColumn(name = "team_id")
private Team team;

@OneToMany(mappedBy = "application", cascade = CascadeType.ALL)
private List<Player> players;

public List<Player> getPlayers() {
    return players;
}

public void setPlayers(List<Player> players) {
    this.players = players;
}
public void addPlayers(Player player){
    System.out.println("---------------1");
    player.setApplication(this);
    System.out.println("---------------2");
    this.players.add(player);
    System.out.println("---------------3");
}
}

Это моя сущность Б:

public class Player {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int Id;

private String name;

private String role;

private String size;

@ManyToOne
@JoinColumn(name = "application_id")
private Application application;

public Application getApplication() {
    return application;
}

public void setApplication(Application application) {
    this.application = application;
}}

Все классы имеют правильные методы получения и установки

Мой класс обслуживания:

    @ResponseStatus(HttpStatus.CREATED)
@Transactional(rollbackFor = Exception.class)
@Override
public Object create(ApplicationsPostDTO applicationsRequest){
    if(Optional.ofNullable(applicationsRequest).isPresent()){
        System.out.println(applicationsRequest.toString());
        Application application = new Application();
        application.setTeam(teamsRepositories.findById(applicationsRequest.getTeam_id()).orElseThrow(BadRequestException::new));
        application.setAccepted(applicationsRequest.isAccepted());
        application.setPaid(applicationsRequest.isPaid());
        System.out.println(application.toString());
        applicationsRequest.getPlayers().forEach(it -> {
            System.out.println(it.toString());
            application.addPlayers(it);

        });
        System.out.println(application.toString());
        return  applicationsRepositories.save(application);
    }else{
        throw new BadRequestException();
    }
}

Ошибка трассировки: Номер экрана 1

Номер экрана2

1 Ответ

0 голосов
/ 18 мая 2018

Это простая проблема npe, вы забыли проверить List на ноль перед добавлением.

Вы либо проверяете ноль и создаете экземпляр List, либо добавляете установки прямо в поле.

@OneToMany(mappedBy = "application", cascade = CascadeType.ALL)
private List<Player> players = new ArrayList<>();
...