2017-02-14 9 views
0

У меня есть несколько методов, которые возвращают данные с помощью GORM и обновляются и сохраняются. Выбрасываются следующие ошибки.Grails/Hibernate: DuplicateKeyException и NonUniqueObjectException

2017-02-14 01:39:02,316 [ERROR ] A different object with the same identifier value was already associated with the session : [com.example.Job#3365090]; nested exception is org.hibern$ 
org.springframework.dao.DuplicateKeyException: A different object with the same identifier value was already associated with the session : [com.example.Job#3365090]; nested exception is org.hibernate.Non$ 
     at com.example.job.JobDaoService.$tt__persistJob(JobDaoService.groovy:88) 
     at com.example.job.JobDaoService.$tt__changeJobStatusByJob(JobDaoService.groovy:225) 

... 
Caused by: org.hibernate.NonUniqueObjectException: A different object with the same identifier value was already associated with the session : [com.example.Job#3365090] 
     ... 23 more 

Мои методы: (1)

Job persistJob(Job job) throws JobException { 
    job.save(flush: true) 

    if (job.hasErrors()) { 
     throw new JobException("Error (ID: ${job?.id}). Details: ${job.errors}", JOB_CANNOT_BE_CREATED_EXCEPTION) 
    } 
    return job 
} 

(2)

@Synchronized 
Job changeStatusByJob(Job job, JobStatus jobStatus) { 
    job.refresh() 
    job.status = jobStatus 

    if (persistJob(job)) { 
     log.info("The status is changed.") 
    } 
    return job 
} 

(3)

@Transactional 
Job getPendingJob() throws JobException { 
    return Job.findByStatusAndCreatedLessThanEquals(READY, new Date(), [sort: "type"]) 
} 

Я добавил @Transactional, job.attach(), job.refresh() и ничего не работало.

+0

Как выглядит работа? Любые двунаправленные отношения? И они с нетерпением ждали? – Hoof

+0

Да. Он имеет двунаправленные отношения и с нетерпением загруженные данные, но не обновляется до сохранения работы. Я просто прочитал значения таблицы отношений. –

+0

Ну. Если существует такое отношение, это, скорее всего, причина исключения неспецифического объекта, так как объект загружается дважды в сеансе ... – Hoof

ответ

0

Попробуйте объединить ваш экземпляр задания перед его сохранением. Merge() принимает переданный экземпляр и объединяет его с любым объектом того же идентификатора, связанного с сеансом.