2016-05-03 5 views
1

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 

Antwort

0

Ich weiß nicht, was JPA-Provider Sie verwenden, da die Abfrage, die Sie gaben, dass ich versuchte, mich gab einen anderen Fehler. Unter Wildfly 10 mit Hibernate 5.0.7.Final bekam ich folgendes zur Arbeit:

em.createQuery("delete from Rate r where r in (select r from Rate r where r.inputCurrency.currency = :currency or r.outputCurrency.currency = :currency)") 
    .setParameter("currency", "USD") 
    .executeUpdate(); 
em.createQuery("delete from Currency where currency=:sCurrency") 
    .setParameter("sCurrency", "USD") 
    .executeUpdate(); 
Verwandte Themen