2015-08-20 38 views
0

在我們的一個彈簧批處理作業中,我們在處理過程中創建了其他實體(CompanyProfile),並將它們保存到數據庫(在單獨的事務中)。這些實體被其他實體(Vacancy),這將是由寫入器被持久引用,但不幸的作家失敗,此錯誤:Spring批處理在處理時找不到實體

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會持續存在 - 我可以在數據庫中看到它,但當VacancyItemWriter保存時,它會因上述例外而失敗。 (另外,請注意,持續實體的ID在上述例外中提及)

您是否看到任何原因導致作者在此情況下失敗?

回答

0

由於您向我們提供的信息是由SB打開的事務無法看到companyProfileService.handleCompany()方法持久的數據,因爲服務組件使用與SB不同的事務;你必須檢查數據庫ISOLATION_LEVEL財產

+1

非常感謝 - 一些我怎麼沒有考慮隔離級別...解決它與'READ_COMMITTED' – domi