Duplikujące się wiersze

0

Witam. Piszę grę webową, w której gracz może budować jednostki. Gracz i jednostka są encjami powiązanymi dwustronnie relacją jeden do wielu. Wykorzystuję Hibernate i Spring Data Jpa jako DAO.

Player.java

@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "owner")
    private List<Unit> units;

Unit.java

@ManyToOne
    private Player owner;

Budowa jednostek odbywa się w funkcji:

@Transactional(rollbackFor = Exception.class, isolation = Isolation.SERIALIZABLE)
    public void buildNewUnit(Player player, UnitType type)
    {
        Unit unit = unitsFactory.create(type); 
        unit.setOwner(player);

        player.getUnits().add(unit);
        playerDAO.save(player);        
    }

W zależności ile jednostek chce zbudować gracz, tyle razy powyższa funkcja jest uruchamiana. Niestety jednostek buduje się więcej niż uruchomień funkcji. I tak:

dla 1 uruchomienia - 1 jednostka (czy dobrze)
dla 2 - 3
dla 3 - 6
dla 4 - 10
 

czyli jak można zauważyć duplikowane są poprzednie jednostki. Przy zmianie kodu na:

List<Unit> unitList = player.getUnits(); 
unitList.add(unit);
player.setUnits(unitList);
playerDAO.save(player);   

i podejrzeniu co znajduje się w unitList wychodzi, że wszystko jest dobrze. Po zdebugowaniu jestem pewny, że błąd występuje w tej funkcji. Bardzo proszę o pomoc.

1

Użyj Set zamiast List i zapewne większość twoich problemów się rozwiąże.

Ok teraz widzę co robisz. Ustawiłeś "mapped by" na Playera owner, ale jak chcesz dodać unita to robisz to z drugiej strony ;] Albo usuwasz to mapped by, albo dodajesz tego unita tak jak zadeklarowałeś, tzn poprzez ustawienie Unitowi Playera i zrobienie save na Unicie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1