Parrent Tabelle: Währung - haben 2 Felder die Fremdschlüssel in der untergeordneten Tabelle darstellt:löschen Werte in untergeordneten Tabelle, wenn Sie Werte in parrent Tabelle JPA löschen
@OneToMany(cascade = CascadeType.ALL, mappedBy = "inputCurrency")
List<Rate> ratesIC;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "outputCurrency")
List<Rate> ratesOC;
Kindertisch: Rate - HAS2 Felder Referenzierung der primäre Schlüssel in der parrent Tabelle:
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "INPUT_CURRENCY")
private Currency inputCurrency;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "OUTPUT_CURRENCY")
private Currency outputCurrency;
Frage: Wie eine Währung und alle Raten zu löschen, die die Währung enthält? Ich möchte nicht orphanRemoval = true
auf ratesIC und ratesOC Felder von Currency verwenden.
Was habe ich versucht: Ich versuchte zunächst, alle Preise, die Währung enthalten, zu löschen:
@NamedQuery(
name = "deleteRateByCurrencyName",
query = "DELETE FROM Rate r "
+ "WHERE r.inputCurrency.currency = :cName "
+ "OR r.outputCurrency.currency = :cName")
dann die Währung löschen aus übergeordneten Tabelle den Namen Währung mit:
@NamedQuery(
name = "deleteCurrencyByCurrencyName",
query = "DELETE FROM Currency c "
+ "WHERE c.currency =:cName")
Ich tat es, indem ich diese Funktion rief:
public void removeCurrencyByNameAndAllRatesContainingThatCurrency(String currency) throws CurrencyNotFoundException {
try {
em.createNamedQuery("deleteRateByCurrencyName")
.setParameter("cName", currency)
.executeUpdate();
em.createNamedQuery("deleteCurrencyByCurrencyName")
.setParameter("cName", currency)
.executeUpdate();
} catch (Exception ex) {
ex.printStackTrace();
throw new CurrencyNotFoundException("The currency " + currency + " doesn't exist!");
}
}
Was erhalte ich:
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: DELETE on table 'CURRENCY' caused a violation of foreign key constraint 'RATEOUTPUTCURRENCY' for key (3). The statement has been rolled back.
Error Code: 20000