2015-08-20 2 views
0

В одном из наших весенних пакетных заданий мы создаем дополнительные объекты (CompanyProfile) во время обработки и сохраняем их в БД (в отдельной транзакции). Эти сущности ссылаются другими лицами (Vacancy), которые будут сохранены писателем, но неудачливый писатель терпит неудачу с этой ошибкой:Весенняя партия не может найти сущность, сохраняющуюся при обработке

Caused by: javax.persistence.EntityNotFoundException: Unable to find com.company.CompanyProfile with id 1409881 

Модели следующим образом:

@Entity 
public class Vacancy { 
    @ManyToOne(fetch = FetchType.EAGER, optional = true) 
    @JoinColumn(name = "company", nullable = true) 
    private CompanyProfile company; 
... 
} 

@Entity 
public class CompanyProfile { 

    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private Long id; 
... 
} 

В процессор у нас есть это:

CompanyProfile company = companyProfileService.handleCompany(compName); 
vacancy.setCompany(company); 

Если метод companyProfileService.handleCompany() помечается @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)

Уверен, что CompanyProfile сохраняется. Я вижу это в БД, но когда Vacancy сохраняется на ItemWriter, он не справляется с вышеуказанным исключением. (также обратите внимание, что идентификатор сохраняемого объекта упоминается в приведенном выше исключении)

Вы видите причину, по которой писатель потерпит неудачу в этом случае?

ответ

0

С информацией, которую вы нам дали, моя догадка заключается в том, что транзакция, открытая SB, не может видеть данные, сохраненные методом companyProfileService.handleCompany(), поскольку компонент службы использует другую транзакцию, чем SB; вы должны проверить базу данных ISOLATION_LEVEL property

+1

большое спасибо - некоторые из того, что я не думал об уровне изоляции ... решил его с помощью «READ_COMMITTED», – domi

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