2012-06-20 2 views
1

В части моего кода, я получаю объект из базы данных через Hibernate, изменить одно поле и зафиксировать изменения обратноHibernate StaleObjectStateException на объекте Я только извлеченной

session = HibernateUtil.beginTransaction(); 
    Song song =SongCache.loadSongFromDatabase(session, songId); 
    song.setLastModified(new Date(new File(song.getFilename()).lastModified() + 1)); 
    session.saveOrUpdate(song); 
    session.getTransaction().commit(); 

класс Песни определяются как я также использовать Hibernate Envers и песня аудит

/** 
* A Song (or sound recording) 
*/ 
@Audited 
@Entity 
public class Song 
{ 
    @Id 
    @GeneratedValue 
    private Integer recNo; 

    @Version 
    private int version; 

    @Basic 
    private String filename; 

    /** 
    * Last Modified Date 
    */ 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date lastModified; 


    public Song(String file) 
    { 
     this.setFilename(file); 
    } 

    public Song() 
    { 

    } 


    @Column(length = 1000) 
    private String album; 
    ...... 
} 

Но иногда я получаю StaleObjectStateException, я не могу понять, как это может произойти

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.jthink.songlayer.Song#1] 
    at org.hibernate.persister.entity.AbstractEntityPersister.check(AbstractEntityPersister.java:2359) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3010) 
    at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:2908) 
    at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3237) 
    at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:113) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:272) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:264) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:187) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1081) 
    at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:315) 
    at org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101) 
    at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175) 
    at com.jthink.buzikmusik.analyse.analyser.SongSaver.saveSongToFile(SongSaver.java:286) 
    at com.jthink.buzikmusik.analyse.analyser.SongSaver.saveChanges(SongSaver.java:75) 
    at com.jthink.buzikmusik.analyse.analyser.SongSaver.call(SongSaver.java:70) 
    at com.jthink.buzikmusik.analyse.analyser.SongSaver.call(SongSaver.java:45) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
+0

Показать исходный код и отображение объекта. –

+0

Ive обновленный вопрос с ключевыми частями –

+0

Вы закрываете сессию после каждой транзакции? Есть ли вероятность, что сеанс остается открытым, что песня, таким образом, остается в кеше сеанса, но этот другой поток изменяет одну и ту же песню в другом сеансе? –

ответ

0

Я всегда закрываю сессию, но в блоке finally(), и это может произойти после того, как я отправил задачу для одной и той же песни другому исполнительному сервису. Поэтому, если эта задача запущена до моего finally block() в первой задаче, проблема может возникнуть, это была проблема.

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