2017-01-13 3 views
0

私は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]] 

答えて

0

のIDをOutletQuestionはOutletとQuestionの間の結合です。 questionRepository.save(question);と呼んだ瞬間に、データベース内の古いOutletQuestionはまだ削除されていません。セット(question.getOutletQuestions().removeAll(question.getOutletQuestions());)からのみ削除しましたが、データベースからは削除しませんでした。

再度同じOutletQuestionを追加しようとすると、EntityExistsExceptionが発生します。新しいOutletQuestionsをデータベースから削除してから、新しいOutletQuestionsを追加してみてください。

+0

removeAll()の後にsaveAndFlushを追加しようとしました: question.getOutletQuestions()。removeAll(question.getOutletQuestions()); questionRepository.saveAndFlush(question); 運がない、まだ同じ例外です。 – user358448

+0

あなたはOutletQuestionRepositoryを使ってそれらを積極的に削除する必要があります。カスケードはここで動作しません。 –

+0

このOutletQuestionRepositoryのPKはどのようにすべきですか? – user358448

関連する問題