【问题标题】:Confusing hibernate behaviour using spring data使用弹簧数据混淆休眠行为
【发布时间】:2020-01-10 15:53:15
【问题描述】:

我刚刚遇到了一个我无法向自己解释的非常奇怪的案例。我有以下情况:

休眠版本:5.4.9

Spring数据版本:2.2.3

所以下面的方法被包装在一个事务中,它只保存实体

   @Transactional
   public Bookmark create(Entity entity) {
     return repository.save(entity);
   }

在这里我注册了一个 PostInsertEventListener。基于一些逻辑,它使用相同的存储库来查询基础表。为了使示例更具可读性,我删除了逻辑。

@Component
public class EntityListener implements PostInsertEventListener {

  @Autowired
  private EntityRepository repository;

  @Autowired
  private EntityManagerFactory entityManagerFactory;

  @PostConstruct
  private void init() {
    final EventListenerRegistry registry = ((SessionFactoryImplementor) entityManagerFactory.unwrap(SessionFactory.class)).getServiceRegistry()
        .getService(EventListenerRegistry.class);
    registry.appendListeners(EventType.POST_INSERT, this);
  }

  @Override
  public void onPostInsert(PostInsertEvent event) {
    if (event.getEntity() instanceof Entity) {
      repository.findByFieldOneAndFieldTwoIsNotNull(event.getEntity().fieldOne());
    }
  }

  @Override
  public boolean requiresPostCommitHanding(EntityPersister persister) {
    return false;
  }

}

因此,当我调用 create(Entity entity) 方法时,onPostInsert(PostInsertEvent event) 被触发(如预期的那样),但是当调用此行时 repository.findByFieldOneAndFieldTwoIsNotNull(event.getEntity().fieldOne()); 然后执行另一个插入并再次触发 onPostInsert(PostInsertEvent event)。当然在某些时候这会导致 StackOverflowException。

有人能想出为什么在我使用 findBy 查询读取数据时会执行另一个插入吗?

【问题讨论】:

    标签: java hibernate spring-data


    【解决方案1】:

    所以我在这个问题上取得了进展。当我在一个新的单独事务中执行repository.findByFieldOneAndFieldTwoIsNotNull(event.getEntity().fieldOne()); 时,一切都很好。因此,似乎在执行插入的同一事务中在实体侦听器中执行查询会导致无限递归,从而导致 StackOverflowException。但我不明白为什么会这样。

    【讨论】:

      猜你喜欢
      • 2016-11-04
      • 2020-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-09
      • 2011-08-09
      • 2012-01-22
      相关资源
      最近更新 更多