当前位置: 首页 > 知识库问答 >
问题:

Hibernate持久化方法在方法执行下一步后抛出异常

季稳
2023-03-14

我使用hibernate持久化方法得到了一些奇怪的结果。下面是解释。

1) 用户服务简单

@Override
@Transactional
public void saveUser(UserDto userDto) throws Exception {
    userDao.saveUser(userDto);
    Queue queue = new ActiveMQQueue("users");
    messageSender.sendUserMessage(queue, userDto);
}

2) 用户道

@Override
public void saveUser(UserDto userDto) throws Exception {
    PCLog.addInfoEntry("UserDaoImpl - SaveUser", "START");
    getEntityManager().persist(userDto);
    PCLog.addInfoEntry("UserDaoImpl - SaveUser", "END");
}

3) JSMListener

@JmsListener(destination="users")
public String processUser(UserDto userDto) throws JsonProcessingException {
    PCLog.addInfoEntry("JMSMessageListener -> ProcesUSers", "USER START");
    userElasticSearchDaoImpl.save(userDto);
    return "ACK from handleMessage";
  }

现在,当我传递重复的电子邮件id时,我的userDao方法应该抛出异常,然后我的下一步* * message sender . send user message(queue,user dto);**不应该叫。但当我传递重复的电子邮件id时,UserDaoImpl抛出错误,但在此之前,我的下一步开始执行。

以下是我用于调试的日志消息

INFO  com.vinayak.life.util.PCLog  -  INFO - UserDaoImpl - SaveUser START 
Hibernate: select nextval ('t_user_master_c_um_npk_id_seq')
Hibernate: select nextval ('t_user_roles_c_ur_npk_role_id_seq')
Hibernate: select nextval ('t_user_roles_c_ur_npk_role_id_seq')
INFO  com.vinayak.life.util.PCLog  -  INFO - UserDaoImpl - SaveUser END 
INFO  com.vinayak.life.util.PCLog  -  INFO - JMSMessageListener -> ProcesUSers : USER START
Hibernate: insert into t_user_master (c_um_lnm_access_profile_id, c_um_bnm_account_not_expired, c_um_bnm_is_locked, c_um_nnm_age, c_um_dnm_birth_date, c_um_dnm_created_date_time, c_um_vnm_email_address, ....

WARN  org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - SQL Error: 0, SQLState: 23505
ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - ERROR: duplicate key value violates unique constraint "t_user_master_c_um_vnm_username_key"
  Detail: Key (c_um_vnm_username)=(test123) already exists.

从上面的日志可以清楚地看出,USER DAO START和USER DAO END语句首先执行,而不是称为JMSMessageListener Process USER,然后从UserDaoImpl执行INSERT语句并抛出错误。

请告诉我我做错了什么。

谢谢

共有1个答案

慕云
2023-03-14

插入/更新/删除总是在hibernate中的事务结束时执行(提交),这意味着Hibernate将执行插入/更新/删除延迟到事务结束(这是Hibernate的功能)。

因此,如果您希望更快地执行插入,则必须强制手动刷新(entityManager.flush())。

 类似资料:
  • 我正在尝试使用Complettable Future异步运行两个任务。该程序异步运行,因此a()和b()以任何顺序同时首先运行。但是c()只能在a()或b()之一完成后运行 我不熟悉CompletableFuture API,有没有办法检查其中一个任务是否完成并调用下一个方法C?

  • 我一直在尝试使用JPA Hibernate和mysql整理与我的DB的连接,但出于某种原因,无论我尝试什么,在启动tomcat服务器时,我都会遇到相同的异常: 这是我的JPA配置类: } 在这一点上,我想不出还有什么可以尝试的。。任何帮助都是非常感激的 编辑:这是整个堆栈跟踪

  • 本文向大家介绍C#异步执行任务的方法,包括了C#异步执行任务的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#异步执行任务的方法。分享给大家供大家参考。具体如下: 希望本文所述对大家的C#程序设计有所帮助。

  • 我目前正在使用TJWSEmBeddedJaxrsServer来帮助我进行我的RESTful应用编程接口测试(用RestEasy创建),它工作起来非常好。但是当任何被调用的方法抛出异常时,就会出现问题: Reastethy客户端变得“丢失”,并且仍然保持连接,不允许其他测试方法调用RESTful服务。即使您实例化了一个可以打开异常并在嵌入式服务器中使用它的提供程序,也会发生这种情况。 谁能帮帮我吗?

  • 这个问题是针对Java和< code>CompletableFuture的。 如果我有一个像下面这样的异步方法, 如果步骤#1中的代码抛出,的调用者将在获得它返回的之前获得异常,而如果步骤#2中返回的中的代码抛出,调用者将仅在与返回的交互时获得异常。 这表明的调用方应该编写一些复杂的异常处理代码来处理这两种情况。 下面是另一个异步方法的示例,,该方法调用并返回它返回的字符串长度: 我的问题是: <