переход в спящий режим / JPA против saveOrUpdate - PullRequest
1 голос
/ 24 февраля 2012

Я использую 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;

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...