merge
のメソッドで問題が発生しましたEntityManager
。
私はこのクラスを持っています
@Entity
public class QuestionList {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String name;
@ManyToOne
private UserEntity user;
@OneToMany(cascade = CascadeType.ALL)
private List<QuestionUnit> units = new ArrayList<QuestionUnit>();
public List<QuestionUnit> getUnits() {
return units;
}
public void setUnits(List<QuestionUnit> units) {
this.units = units;
}
public Long getId() {
return id;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void addQuestionUnit(QuestionUnit QuestionUnit) {
this.units.add(QuestionUnit);
}
public void setUser(UserEntity user) {
this.user = user;
}
public UserEntity getUser() {
return this.user;
}
}
今、units
マージ内のオブジェクトの1つを変更するだけなら問題ありませんが、コレクションに新しいオブジェクトを削除または追加すると、マージが発生する方法は、取得delete
from
QuestionList_QuestionUnit
where
QuestionList_id=?
してからすべての行が1つずつ追加されることですinsert
into
QuestionList_QuestionUnit
(QuestionList_id, units_id)
values
(?, ?)
追加/削除されたオブジェクトに関連付けられた行を追加/削除するように JPA/Hibernate に指示することは可能ですか? または、マージがコレクションで機能する方法ですか。私の場合、データベースを更新するための独自のクエリを作成する必要があります。
このコレクションはかなり巨大になる可能性があり、すべての行を削除してほぼすべてを再度挿入するだけでは、テーブルを更新する良い方法とは思えないため、質問しています。
編集:要求に応じて:
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class QuestionUnit {
@Id
@GeneratedValue(strategy = GenerationType.TABLE)
private long id;
@OneToOne(cascade = CascadeType.ALL)
private AnswerUnit correctAnswer;
public QuestionUnit(AnswerUnit correctAnswer) {
this.correctAnswer = correctAnswer;
}
public void setCorrectAnswer(AnswerUnit correctAnswer) {
this.correctAnswer = correctAnswer;
}
public AnswerUnit getCorrectAnswer() {
return this.correctAnswer;
}
public long getId() {
return id;
}
public void setId(long id){
this.id=id;
}
public abstract Object getQuestionContent();
public abstract String getTitle();
}
この階層には 3 つの具象クラスがあります。たとえば、
@Question("openQuestion")
@Entity
public class OpenQuestion extends QuestionUnit {
public void setQuestionContent(String questionContent) {
this.questionContent = questionContent;
}
private String questionContent;
public OpenQuestion() {
this(null, new OpenQuestionAnswer());
}
public OpenQuestion(String questionContent, AnswerUnit correctAnswer) {
super(correctAnswer);
this.questionContent = questionContent;
}
public String getQuestionContent() {
return this.questionContent;
}
public String getTitle() {
return questionContent;
}
}
@Transactional(propagation = Propagation.REQUIRED)
public void update(QuestionList questionList) {
entityManager.merge(questionList);
}
リストは切り離された状態であるため、このメソッドはすべての更新に使用されます。