java - Hibernate persist 方法在方法执行下一步后抛出异常

标签 java spring hibernate jpa

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

1) UserServiceImpl

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

2)UserDaoImpl

@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 方法应该抛出异常,然后我的下一步 ** messageSender.sendUserMessage(queue, userDto); ** 不应调用。但是当我传递重复的电子邮件 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 语句并抛出错误。

请告诉我我做错了什么。

谢谢

最佳答案

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

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

关于java - Hibernate persist 方法在方法执行下一步后抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37429727/

相关文章:

java - 将表映射到 Hibernate 中的两个继承表

java - 为什么 Hibernate 尝试删除关联对象?

Spring boot - 登录后返回用户对象

spring - 文件上传 API 在 Postman 中有效,但在 React JS 中无效

java - Hibernate over JPA 配置 xml 文件

ArrayList 中的 Java 排序对象

java - SQL 错误 17268 : Year out of range (Java/Spring)

java - Java 编译器警告会影响编译时间吗?

java - java中的方法如何返回Set?

java - 以编程方式设置(Spring)bean 属性