Mam problem ponieważ tworzę plugin do minecrafta z wykorzytsaniem funkcjonalności Spring Boota do łatwego manipulowania na bazie. Jako bazę wykorzystuje MariaDB a czasami też PostgresSql. Jeżeli chodzi o komunikację z bazą nie ma problemu. Dzisiaj tworząc plugin na działki napotkałem na problem związany z relacyjnością. otóż stworzyłem sobie 4 Entity: Plot (działka), PlotSetting (czyli ustawiania działki globalne), PlotPlayer (gracz przynależący do działki) i PlotPlayerSettings (czyli ustawienia dla gracza, bo jeżeli w ustawieniach globalnych jest zezwolone niszczenie bloków, a w ustawieniach gracza nie to nie będzie mógł tego robić). Relacje pomiędzy Encjami są takie Plot 1...* PlotPlayer, PlotPlayer 1...1 PlotPlayerSettings, Plot 1...1 PlotSettings. Problem jest taki, że jak chcę usunąć obiekt Plot to usuwa się przywiązany do niego PolotSettings, ale nie usuwają się PlotPlayers i co za tym idzie PlotPlayerSettings. A zależało mi na tym, że przy usunięciu działki usuwają się jej ustawiania + gracze do niej przypisani z ich ustawieniami. A oto moje encje w kodzie:
@Entity
public class Plot {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private String plotName;
@OneToOne(mappedBy = "plot", cascade = CascadeType.ALL, orphanRemoval = true)
private PlotSettings plotSettings;
@OneToMany(mappedBy = "plot", cascade = CascadeType.ALL)
private Set<PlotPlayer> plotPlayers = new HashSet<>();
}
@Entity
public class PlotPlayer {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne(cascade = CascadeType.REFRESH)
@JoinColumn(name = "plot_id")
private Plot plot;
private String playerUUID;
private String playerName;
@Enumerated(EnumType.ORDINAL)
private Role role;
@OneToOne(mappedBy = "plotPlayer", cascade = CascadeType.ALL, orphanRemoval = true)
private PlotPlayerSettings plotPlayerSettings;
}
@Entity
public class PlotPlayerSettings {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
private PlotPlayer plotPlayer;
private boolean pickUpItems;
}
@Entity
public class PlotSettings {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@OneToOne
private Plot plot;
private boolean pickUpItems;
}