私はspring jpaで余分な列(アクティベーション)を持つことが多いので、関連付けを編集したい(別のリンクを追加/削除する)。EntityAlreadyExist Exceptionを取得せずに、余分な列を持つ多くの人と多くの人の関連付けを管理するにはどうすればよいですか?
class Question
.....
@OneToMany(mappedBy = "question",cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH})
private Set<OutletQuestion> outletQuestions = new HashSet<>();
.....
class Outlet
@OneToMany(mappedBy = "outlet", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH})
private Set<OutletQuestion> outletQuestions = new HashSet<>();
......
@Entity
@Table(name = "outlets_questions")
public class OutletQuestion implements Serializable {
@Id
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "outlet_id")
private Outlet outlet;
@Id
@ManyToOne
@NotFound(action = NotFoundAction.IGNORE)
@JoinColumn(name = "question_id")
private Question question;
@Column(name="activated")
private boolean activated;
public Outlet getOutlet() {
return outlet;
}
public void setOutlet(Outlet outlet) {
this.outlet = outlet;
}
public Question getQuestion() {
return question;
}
public void setQuestion(Question question) {
this.question = question;
}
public boolean isActivated() {
return activated;
}
public void setActivated(boolean activated) {
this.activated = activated;
}
}
マイコードのためのアウトレットと質問の間のリンクの編集:
public Question saveWithOutlets(QuestionWithOutletsRequest questionWithOutletsRequest) {
Question question = questionRepository.findOne(questionWithOutletsRequest.getQuestionId());
List<Outlet> outletsToLink = outletRepository.findAll(questionWithOutletsRequest.getOutletIds());
// remove all previous links
question.getOutletQuestions().removeAll(question.getOutletQuestions());
// insert new
for (Outlet o : outletsToLink) {
OutletQuestion oq = new OutletQuestion();
oq.setActivated(true);
oq.setOutlet(o);
oq.setQuestion(question);
question.getOutletQuestions().add(oq);
}
questionRepository.save(question);
return question;
}
私は次のエラー取得しています:
javax.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [tipps.core.domain.OutletQuestion#[email protected]]
removeAll()の後にsaveAndFlushを追加しようとしました: question.getOutletQuestions()。removeAll(question.getOutletQuestions()); questionRepository.saveAndFlush(question); 運がない、まだ同じ例外です。 – user358448
あなたはOutletQuestionRepositoryを使ってそれらを積極的に削除する必要があります。カスケードはここで動作しません。 –
このOutletQuestionRepositoryのPKはどのようにすべきですか? – user358448