问题
I have 2 tables: Currency and Rate
The currency's primary key is referenced by the inputCurrency and outputCurrency foreigh keys in the Rate.
How can I map these in order to cascadeALL?
I tried in Rate (the table that contains the foreigh keys)
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "INPUT_CURRENCY")
private Currency inputCurrency;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "OUTPUT_CURRENCY")
private Currency ouputCurrency;
But if I delete an item from currency It results a primary key violation.I can't remove a Currency becouse it is referenced by inputCurrency or outputCurrency in Rate.
If I want to annotate the list of rates in Currency, how can I say mappedBy = "inputCurrency" and "outputCurrency" ?
@OneToMany(cascade = CascadeType.ALL,mappedBy ="inputCurrency,outputCurrency")
List<Rate> rates;
回答1:
The solution is using two list of rates in Currency: one for the fk inputCurrency and another for the fk outputCurrency
@OneToMany(cascade = CascadeType.ALL,mappedBy ="inputCurrency")
List<Rate> ratesIC;
@OneToMany(cascade = CascadeType.ALL,mappedBy ="outputCurrency")
List<Rate> ratesOC;
回答2:
You can settle with two collections:
List<Rate> inputRate;
List<Rate> outputRate;
Each with a corresponding mappedBy
and a third @Transient List<Rate> rates;
You can use a @PostLoad
event to unite the two persistent lists into the transient one.
And similarly, when adding/removing elements to one of the persistent lists, make sure to add/remove from the joint list.
来源:https://stackoverflow.com/questions/37000890/how-to-use-mappedby-with-more-than-one-value-jpa