【发布时间】: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