我偶然發現merge
方法的問題EntityManager
。JPA與休眠 - 合併性能問題
我有這個類
@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
合併是好的,但如果我刪除或添加新對象的集合,該合併的方式發生的事情是我得到delete from QuestionList_QuestionUnit where QuestionList_id=?
,然後逐行添加每一行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);
}
這種方法適用於所有的更新,因爲列表是處於分離狀態。
您可以包括QuestionUnit類和被做刪除/添加對象的代碼,合併嗎? – gkamal
發佈代碼片段。 – Andna