Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jpa@Transactional+;ElasticSearchEventListener(PostInsertEventListener…)_Java_Spring_Hibernate_Jpa_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch - Fatal编程技术网 elasticsearch,Java,Spring,Hibernate,Jpa,elasticsearch" /> elasticsearch,Java,Spring,Hibernate,Jpa,elasticsearch" />

Java jpa@Transactional+;ElasticSearchEventListener(PostInsertEventListener…)

Java jpa@Transactional+;ElasticSearchEventListener(PostInsertEventListener…),java,spring,hibernate,jpa,elasticsearch,Java,Spring,Hibernate,Jpa,elasticsearch,我遇到了一个与JPA相关的问题&我配置了一些hibernate侦听器,将Db实体索引/解索引到弹性搜索中。问题基本上是,即使我在持久化实体的方法中抛出异常,并且该方法被标记为@Transactional(rollboor={Throwable.class}),也会调用listener onPostInsert方法。我的配置如下 侦听器类: public class ElasticSearchEventListener implements PostDeleteEventListener,

我遇到了一个与JPA相关的问题&我配置了一些hibernate侦听器,将Db实体索引/解索引到弹性搜索中。问题基本上是,即使我在持久化实体的方法中抛出异常,并且该方法被标记为@Transactional(rollboor={Throwable.class}),也会调用listener onPostInsert方法。我的配置如下

侦听器类:

public class ElasticSearchEventListener implements PostDeleteEventListener,
    PostInsertEventListener, PostUpdateEventListener {

    @Override
    public void onPostInsert(PostInsertEvent event) {
        log.debug("Listener indexing entity");
        try {
           updateElasticSearch(event.getEntity());
        } catch (Exception e) {
           log.debug("Error indexing object from listener");
           e.printStackTrace();
        }
    }

    .......
}
@Service @Log4j
public class ListenerConfigurerImpl implements ListenerConfigurer {
    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private ElasticSearchEventListener listener;

    @PostConstruct @Override
    public void registerListeners() {
        log.debug("Registering event listeners");
        HibernateEntityManagerFactory hibernateEntityManagerFactory = (HibernateEntityManagerFactory) this.entityManagerFactory;
        SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
        EventListenerRegistry registry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);

        .......
    }
}
@Service @Log4j
public class ConversationServiceImpl implements ConversationService {

    @Override        
    @Transactional(rollbackFor = {Throwable.class})
    public void quotePackage(Long userId, CustomQuoteDTO dto) {
        ......
        Conversation conversation = Conversation.createAndAssign(user, agency, type, subject);
        conversation = conversationRepository.save(conversation);
        Long conversationId = conversation.getId();

        if (1 == 1) throw new RuntimeException();
    }
}
侦听器配置的类:

public class ElasticSearchEventListener implements PostDeleteEventListener,
    PostInsertEventListener, PostUpdateEventListener {

    @Override
    public void onPostInsert(PostInsertEvent event) {
        log.debug("Listener indexing entity");
        try {
           updateElasticSearch(event.getEntity());
        } catch (Exception e) {
           log.debug("Error indexing object from listener");
           e.printStackTrace();
        }
    }

    .......
}
@Service @Log4j
public class ListenerConfigurerImpl implements ListenerConfigurer {
    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private ElasticSearchEventListener listener;

    @PostConstruct @Override
    public void registerListeners() {
        log.debug("Registering event listeners");
        HibernateEntityManagerFactory hibernateEntityManagerFactory = (HibernateEntityManagerFactory) this.entityManagerFactory;
        SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
        EventListenerRegistry registry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);

        .......
    }
}
@Service @Log4j
public class ConversationServiceImpl implements ConversationService {

    @Override        
    @Transactional(rollbackFor = {Throwable.class})
    public void quotePackage(Long userId, CustomQuoteDTO dto) {
        ......
        Conversation conversation = Conversation.createAndAssign(user, agency, type, subject);
        conversation = conversationRepository.save(conversation);
        Long conversationId = conversation.getId();

        if (1 == 1) throw new RuntimeException();
    }
}
服务类:

public class ElasticSearchEventListener implements PostDeleteEventListener,
    PostInsertEventListener, PostUpdateEventListener {

    @Override
    public void onPostInsert(PostInsertEvent event) {
        log.debug("Listener indexing entity");
        try {
           updateElasticSearch(event.getEntity());
        } catch (Exception e) {
           log.debug("Error indexing object from listener");
           e.printStackTrace();
        }
    }

    .......
}
@Service @Log4j
public class ListenerConfigurerImpl implements ListenerConfigurer {
    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Autowired
    private ElasticSearchEventListener listener;

    @PostConstruct @Override
    public void registerListeners() {
        log.debug("Registering event listeners");
        HibernateEntityManagerFactory hibernateEntityManagerFactory = (HibernateEntityManagerFactory) this.entityManagerFactory;
        SessionFactoryImpl sessionFactoryImpl = (SessionFactoryImpl) hibernateEntityManagerFactory.getSessionFactory();
        EventListenerRegistry registry = sessionFactoryImpl.getServiceRegistry().getService(EventListenerRegistry.class);
        registry.getEventListenerGroup(EventType.POST_COMMIT_INSERT).appendListener(listener);

        .......
    }
}
@Service @Log4j
public class ConversationServiceImpl implements ConversationService {

    @Override        
    @Transactional(rollbackFor = {Throwable.class})
    public void quotePackage(Long userId, CustomQuoteDTO dto) {
        ......
        Conversation conversation = Conversation.createAndAssign(user, agency, type, subject);
        conversation = conversationRepository.save(conversation);
        Long conversationId = conversation.getId();

        if (1 == 1) throw new RuntimeException();
    }
}
基于此配置,我希望会话实体不会保存在DB或弹性搜索中。该实体未保留在数据库中,这是正确的,但由于某些原因,“onPostInsert”仍在执行。。。我在弹性搜索中得到实体,即使它不在数据库中

有什么想法吗?我有点迷路了。 提前谢谢

编辑1------

我从2006年就发现了这个bug,但它仍然存在,这似乎是我的问题:


这应该是这样的吗?

此处添加的拉取请求修复了此问题