Я использую 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) для сохранения нового расписания / обновления существующего расписания. Проблема в том, что когда я пытался обновить существующее расписание, оно генерировало экстремумы большого количества запросов на выборку, чтобы получить все (возможно, нет) записи расписания перед выполнением действия обновления. I Поскольку отправляется все больше и больше расписаний, функция объединения становится медленнее.
Когда я обновляю пользователя, у меня возникает та же проблема.
Я изменил его на 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;
}