我使用Spring JPA。
我有两个实体时间表和用户。他们有多对一的关系。我把它们定义为
@Entity
@Table(name = "timesheet")
public class TimeSheet implements java.io.Serializable {
...
private User user;
......
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", referencedColumnName = "user_id", nullable = false)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
和
@Entity
@Table(name = "user")
public class User implements java.io.Serializable {
...
private List<TimeSheet> timesheet = ShrinkableLazyList
.decorate(new ArrayList(), FactoryUtils
.instantiateFactory(TimeSheet.class));
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
public List<TimeSheet> getTimesheet() {
return timesheet;
}
public void setTimesheet(List<TimeSheet> timesheet) {
this.timesheet = timesheet;
}
我通常使用entityManager.merge(timeSheet)来保存新的时间表/更新现有的时间表。问题是当我尝试更新现有的时间表时,它会生成极值大量的选择查询,以便在执行更新操作之前获取所有(可能不是)时间表记录。我随着越来越多的时间表被提交,合并功能变慢了。
当我更新用户时,我遇到了同样的问题。
我把它改成了session.merge,同样的问题。
我将其更改为session.saveOrUpdate。它很快,但有时会抛出会话异常。
我仍然喜欢使用合并方法,但不知道导致慢度问题的原因是什么?
请帮忙。感谢。
更新1:
我得到的极端查询次数,大约需要2分钟
........................................
Hibernate: select timesheet0_.timesheet_id as ...........
Hibernate: select timesheet0_.timesheet_id as ...........
Hibernate: select timesheet0_.timesheet_id as ...........
Hibernate: select timesheet0_.timesheet_id as ...........
Hibernate: select timesheet0_.timesheet_id as .........
.........................................
更新2:
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public TimeSheet saveTimeSheet(TimeSheet timeSheet) {
// Session s=entityManager.unwrap(HibernateEntityManager.class).getSession();
// s.saveOrUpdate(timeSheet);
TimeSheet result = entityManager.merge(timeSheet);
// TimeSheet result=timeSheet;
return result;
}