2016-06-30 2 views
0

У меня есть два связанных entites:почему спящий режим DB обновление после выселить

@Entity 
@DynamicUpdate(true) 
public class DreamTaskInfo { 
    private DreamInfo dreamInfo; 
    @ManyToOne 
    @JoinColumn(name = "DREAM_INFO_ID", nullable = false) 
    public DreamInfo getDreamInfo() { 
     return dreamInfo; 
    } 
... 
} 

@Entity 
@DynamicUpdate(true) 
public class DreamInfo { 
    private Set<DreamTaskInfo> dreamTasks = new LinkedHashSet<>(); 
    @OneToMany(mappedBy = "dreamInfo",cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @OrderBy("remindTime") 
    public Set<DreamTaskInfo> getDreamTasks() { 
    return dreamTasks; 
    } 
    ... 
} 

Я хочу использовать данные DreamTaskInfo из БД только для чтения использования, поэтому я делаю это:

DreamTaskInfo task = this.get(id);//query from db 
getSession().evict(task);//getSession().contains(task)==false 

Но я считаю, out Hibernate всегда выполняет обновление sql для этой задачи при сбросе. Наконец, я использую getSession(). Clear() вместо evict, и он работает. Может быть, с нетерпением получить или связать результат в чем-то в сессии? На самом деле, я ничего не могу изменить вручную и спящий режим обновления автоматически, поэтому он не имеет ничего общего с этим question.

+0

Возможный дубликат [Hibernate: evict() постоянный объект при сохранении его изменений] (http://stackoverflow.com/questions/6836326/hibernate-evict-a-persistent-object-while-storing-its-changes) –

+0

Можете ли вы опубликовать запрос обновления вместе с его параметрами. Стоит отлаживать, чтобы узнать, почему было создано обновление. –

+0

@ Vlad Mihalcea, на самом деле он обновляет каждое поле записи со значением запроса из БД. – yuxh

ответ

0

вы должны очистить сеанс перед вызовом evict(). Тогда вы не увидите запрос обновления, выполняемый после evict().

Решение:

DreamTaskInfo task = this.get(id);//query from db 
getSession().flush();// to make sure atomicity of session is maintained 
getSession().evict(task);//getSession().contains(task)==false 

Там могли быть внесены некоторые изменения после того, как вы скачали объект из базы данных, поэтому спящий режим будет работать запрос обновления.

Сессия предназначена для интерфейса на основе работы на рабочем месте, по уважительной причине - транзакционная семантика была бы катастрофой без этой функции. Если вам нужно очистить отдельные объекты, не смывая других, которые являются частью одного и того же сеанса, вам нужно переосмыслить свое подразделение.

+0

Я забыл упомянуть, что я пробовал этот путь, но не работал. – yuxh

+0

«возможно, были некоторые изменения после того, как вы взяли объект из базы данных». У меня такая же мысль, но я использую junit для проверки этого метода и ничего не изменяю, поэтому не знаю, как это происходит точно. – yuxh

+0

даже если вы ничего не изменили. Вам все равно нужно вызвать флеш для сеанса. Но, согласно вашему предыдущему комментарию, я думаю, вы это пробовали. Я еще раз проверю и вернусь к вам. –

Смежные вопросы