2012-09-05 105 views
2

我偶然发现merge方法的问题EntityManagerJPA与休眠 - 合并性能问题

我有这个类

@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); 
} 

这种方法适用于所有的更新,因为列表是处于分离状态。

+0

您可以包括QuestionUnit类和被做删除/添加对象的代码,合并吗? – gkamal

+0

发布代码片段。 – Andna

回答

2

它认为问题是由于使用List而不是Set引起的。

@OneToMany(cascade = CascadeType.ALL) 
private List<QuestionUnit> units = new ArrayList<QuestionUnit>(); 

变化

@OneToMany(cascade = CascadeType.ALL) 
private Set<QuestionUnit> units = new HashSet<QuestionUnit>(); 

Hibernate Many to Many Relations Set Or List?

+0

谢谢,这清除了它。 – Andna