Spring Data JPA findOne返回null

时间:2017-02-14 18:27:44

标签: spring hibernate spring-data spring-data-jpa

我正在使用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);
}

}

有人可以指出我在哪里错误。

1 个答案:

答案 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
  }
}