我正在使用Spring Data JPA,我面临着一个非常奇怪的问题,即find尽管行存在于DB中,它仍返回null。
我有一个消费者线程,它从队列中获取一个id并尝试从DB中获取实体,该实体始终返回null,但是如果我暂停线程(通过在方法调用之前放置一个断点),那么它从DB获取实体但是在程序的正常执行中返回null,我知道它对于断点的东西听起来很奇怪,但它就是它,可能是我遗漏了一些东西。我的代码如下所示: -
return new ObjectMapper().readValue({jsonValue}, Result.class);
我没有在“employeeService”中使用任何事务,因为它不是必需的,因为它是一个读操作。
我的服务看起来像
if (id > 0) {
employee = employeeService.get(id);
if (employee == null) {
logger.error(String.format("No employee found for id : %d",
id));
return;
}
我的模型看起来像: -
public Employee get(long id) {
return employeeDao.findOne(id);
}
}
有人可以指出我在哪里错误。
答案 0 :(得分:2)
Spring 4.2的方法是在spring组件上引入一个@TransactionEventListener
带注释的方法来处理回调。然后,您只需要发布一个事件,让事件框架完成它的任务:
// Spring component that handles repository interactions
@Component
public class ProducerService implements ApplicationContextAware {
private ApplicationContext applicationContext;
@Transactional
public void doSomeThingAwesome(String data) {
MyAwesome awesome = new MyAwesome( data );
myAwesomeRepository.save( awesome );
applicationContext.publishEvent( new MyAwesomeSaved( awesome.getId() ) );
}
}
// Spring component that handles the AFTER_COMMIT transaction callback
// This component only fires when a MyAwesomeSaved event is published and
// the associated transaction it is published in commits successfully.
@Component
public class QueueIdentifierHandler {
@TransactionalEventListener
public void onMyAwesomeSaved(MyAwesomeSaved event) {
Long entityId = event.getId();
// post the entityId to your queue now
}
}