2016-01-22 2 views
3

Я хочу удалить отношение с одной стороны. Позволь мне объяснить.Как удалить объект в одной стороне при двунаправленном отношении?

Моей база данных выглядит следующим образом: enter image description here

я основывала свои хранилища на JPARepository.

и у меня есть два объекта Team и Player.

Player Entity выглядит следующим образом:

@Entity 
    @Table(name = "PLAYER") 
    public class Player implements Serializable, Comparable<Player>{ 
     private static final long serialVersionUID = 1L; 

     @Id 
     @GeneratedValue(strategy=GenerationType.AUTO) 
     private Long id_player; 

     @Size(min=3, max=20) 
     private String name; 
     @Size(min=3, max=20) 
     private String surname; 
     @Size(min=3, max=20) 
     private String position; 
     @Min(value=10) 
     private int age; 
     @Min(value=1) 
     private int number; 

     @ManyToOne(fetch = FetchType.LAZY) 
     @JoinColumn(name = "id_team") 
     private Team team; 
     //getters and setters 
    } 

... и Team сущность:

@Entity 
@Table(name = "TEAM") 
public class Team implements Serializable, Comparable<Team>{ 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy=GenerationType.AUTO) 
    private Long id_team; 
    @Size(min=4, max=20) 
    private String name; 
    @Size(min=4, max=20) 
    private String city; 
    private int goals_hit; 
    private int goals_lost; 
    private int points; 
    private int ranked; 

    @OneToOne(cascade = CascadeType.MERGE) 
    @JoinColumn(name = "id_coach") 
    private Coach coach; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "id_stadium") 
    private Stadium stadium; 

    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY) 
    private List<Player> playerList; 

    @OneToMany(mappedBy = "team", fetch = FetchType.LAZY) 
    private List<TeamChoosenDate> teamChoosenDateList; 
    //getters and setters 
} 

Так Player содержит одно отношение к Team но Team содержит List из Players.

Тренер может изменить свою команду и, например, он хочет удалить Player из Team (соотношения между Team ->Player), но не потерять Player (потому что он имеет отношение с другими таблицами - Events).

В заключение: Удалить Player от правильного Team, но НЕ ПОТЕРЯТЬ Player объект.

Как это сделать?

Моя попытка: Я удалить Player из List, но каждый раз, когда я перезагрузки - он возвращается ... Ниже метод показывает, как я это делаю:

public void deletePlayerFromTeamPlayerList(Long idTeam, int idPlayer){ 

    Team team = teamRepository.findOne(idTeam); 
    Player playerTmp = playerRepository.findOne((long) idPlayer); 

    List<Player> playerList; 

    int indexOfFindedPLayer; 


    playerList = team.getPlayerList(); 

    System.out.println("Before Delete: " + playerList.toString()); 

    indexOfFindedPLayer = playerList.indexOf(playerTmp); 

    if(indexOfFindedPLayer >= 0){ 
     playerList.remove(indexOfFindedPLayer); 

     System.out.println("After Delete: " + playerList.toString()); 

     team.setPlayerList(playerList); 
     teamRepository.save(team); 
    } 
} 

Но когда элемент удаляется, в Player объект id_team все тот же (например, id_team = 2)

Спасибо за все предложения!

ответ

4

Вы можете достичь этого более просто, выполнив ниже:

public void deletePlayerFromTeam(int idPlayer){ 
    Player player = //loadPlayer; 
    player.setTeam(null); 

    playerRepository.save(player); 
} 

Вы также можете достичь этого в исходном коде, установив player.team обнулить и и установив каскад на коллекции слияние:

@OneToMany(mappedBy = "team", fetch = FetchType.LAZY, cascade = CascadeType.MERGE) 
private List<Player> playerList; 

Вы всегда должны следить за тем, чтобы обе стороны отношений поддерживались последовательно.

+3

Я собирался прокомментировать что-то вроде этого. Кстати, я бы добавил, что модель базы данных должна быть изменена, чтобы иметь дополнительную таблицу/сущность для представления отношения между игроком/командой, поэтому было бы намного лучше для этих типов вещей. – Bonifacio

+0

'Произошла непредвиденная ошибка (тип = Внутренняя ошибка сервера, статус = 500). Ошибка обработки запроса; Вложенное исключение - org.springframework.dao.DataIntegrityViolationException: невозможно выполнить оператор; SQL [n/a]; ограничение [null]; Вложенное исключение - org.hibernate.exception.ConstraintViolationException: не удалось выполнить оператор 'и в консоли' Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'id_team' не может быть нулевым. – czArek

+0

Поле типа 'id_team'' 'int ', но, возможно, мне следует добавить некоторые параметр, который позволяет этому полю быть «нулевым»? – czArek

Смежные вопросы