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.