hibernate / JPA merge vs saveOrUpdate

时间:2012-02-24 15:29:20

标签: hibernate jpa merge

我使用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;

}

0 个答案:

没有答案