Usuwanie powiązanych obiektów w relacji

0

Cześć,

Mam problem w relacji @ManyToOne. Chciałbym usunąć listę zamówień użytkownika ( użytkownik ma zostać nienaruszony ) z poziomu listy zamówień jednak przy okazji usuwa mi też wszystko inne co połączone jest z użytkownikiem. Bez parametru cascade = CascadeType.ALL / REMOVE w adnotacji usuwanie w ogóle nie działa. Czy da się to jakoś załatwić inaczej niż zapytaniem do bazy @Query ?

listOfFighterHeavyweight oraz listOfFighterLightHeavyweight też przy usuwaniu mają zniknąć - nie chce osieroconych obiektów.


@Entity
@Table(name = "user_orders")
public class Order {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_order")
	private long id;

	@ManyToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "fighter_heavyweight_id", referencedColumnName = "id_order")
	private List<FighterHeavyweight> listOfFighterHeavyweight = new ArrayList<>();
	
	@ManyToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "fighter_lightheavyweight_id", referencedColumnName = "id_order")
	private List<FighterLightHeavyweight> listOfFighterLightHeavyweight = new ArrayList<>();

	@JsonBackReference
	@ManyToOne(fetch = FetchType.LAZY)           // ???
	@JoinColumn(name = "user_id")
	private User user;

	public Order() {
	}

	public void addFighterHeavyweight(FighterHeavyweight fighterHeavyweight) {
		this.listOfFighterHeavyweight.add(fighterHeavyweight);
	}

	public void addFighterLightHeavyweight(FighterLightHeavyweight fighterLightHeavyweight) {
		this.listOfFighterLightHeavyweight.add(fighterLightHeavyweight);
	}

	//gettery settery

}
@Entity
@Table(name = "users")
public class User {

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id_user")
	private long id;

	@NotEmpty
	private String nickname;

	@NotEmpty
	private String email;

	@NotEmpty
	private String password;

	@OneToOne(fetch = FetchType.EAGER, cascade = { CascadeType.ALL })
	@JoinColumn(name = "id_details")
	private UserDetails userDetails;

	@JsonManagedReference
	@OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = { CascadeType.ALL }, orphanRemoval = true)
	private List<Order> orders = new ArrayList<>();

	@ManyToMany(cascade = CascadeType.PERSIST, fetch = FetchType.EAGER)
	private Set<UserRole> roles = new HashSet<>();

	public void addOrder(Order order) {
		order.setUser(this);
		getOrders().add(order);
	}

	public User() {
	}

//gettery settery

}
1
  1. Wczytaj usera i zrób clear() na liście zamówień - powinno pomóc
  2. Albo usuń przez query, przy wielu zamówieniach to nawet wskazane. Obserwuj wygenerowane SQL, powinien pójść jeden delete.

EDIT: https://thoughts-on-java.org/avoid-cascadetype-delete-many-assocations/

Pare uwag:

  1. Masz zaśmiecony model jakimiś @JsonManagedReference
  2. Masz niepotrzebną relacje dwustronną, która może być przyczyną problemu
  3. Nie używaj kaskad, jeśli nie musisz. CascadeType.ALL to już w ogóle kosmos i całkowita utrata kontroli nad modelem.
  4. Zastanów się czy w ogóle potrzebujesz mieć te relacje @OneToMany. Serio. W JPA nie chodzi o to, żeby spiąć ze sobą adnotacjami cała bazę danych.

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