带Hibernate的JPA-合并性能问题
我偶然发现带Hibernate的JPA-合并性能问题,hibernate,jpa,orm,Hibernate,Jpa,Orm,我偶然发现EntityManager的merge方法存在问题 我有这门课 @Entity public class QuestionList { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; @ManyToOne private UserEntity user; @OneToMany(cascade
EntityManager
的merge
方法存在问题
我有这门课
@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;
}
}
例如,在这个层次结构中有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);
}
此方法用于所有更新,因为列表处于分离状态。它认为问题是由于使用列表而不是Set造成的
@OneToMany(cascade = CascadeType.ALL)
private List<QuestionUnit> units = new ArrayList<QuestionUnit>();
@OneToMany(cascade=CascadeType.ALL)
私有列表单位=新的ArrayList();
改为
@OneToMany(cascade = CascadeType.ALL)
private Set<QuestionUnit> units = new HashSet<QuestionUnit>();
@OneToMany(cascade=CascadeType.ALL)
私有集合单位=新HashSet();
是否可以包含QuestionUnit类和执行删除/添加对象、合并的代码?
@OneToMany(cascade = CascadeType.ALL)
private Set<QuestionUnit> units = new HashSet<QuestionUnit>();