2016-05-03 17 views
1

Parrent表:主を参照HAS2フィールド - - レート:削除値あなたはparrentテーブルの値を削除JPA

@OneToMany(cascade = CascadeType.ALL, mappedBy = "inputCurrency") 
List<Rate> ratesIC; 

@OneToMany(cascade = CascadeType.ALL, mappedBy = "outputCurrency") 
List<Rate> ratesOC; 

子テーブル通貨は、子表の外部キーを表す2つのフィールドを持っていますparrentテーブルのキー:

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "INPUT_CURRENCY") 
private Currency inputCurrency; 

@ManyToOne(cascade = CascadeType.ALL) 
@JoinColumn(name = "OUTPUT_CURRENCY") 
private Currency outputCurrency; 

が質問:その通貨が含まれている通貨とすべての料金を削除する方法?私は orphanRemoval = trueを通貨のratesICとratesOCフィールドに使用したくありません。

私がしようとしているもの:

@NamedQuery(
     name = "deleteCurrencyByCurrencyName", 
     query = "DELETE FROM Currency c " 
     + "WHERE c.currency =:cName") 

@NamedQuery(
     name = "deleteRateByCurrencyName", 
     query = "DELETE FROM Rate r " 
     + "WHERE r.inputCurrency.currency = :cName " 
     + "OR r.outputCurrency.currency = :cName") 

は、親テーブルから名前の通貨を持つ通貨を削除する: は、私はすべての料金は、その通貨を含む削除するために最初に試み

私はこの関数を呼び出すことによってそれを行いました:

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!"); 
     } 
    } 

私は何を得る:

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 

答えて

0

あなたは、私が試したことを与えたクエリは私に別のエラーを与えたので、私はあなたが使用しているJPAプロバイダを知りません。 Wildfly 10の下でHibernate 5.0.7.Final私は働くために以下を得ました:

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();