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