【问题标题】:Hibernate persist method throws exception after method execute next stepHibernate persist 方法在方法执行下一步后抛出异常
【发布时间】:2016-05-25 15:15:42
【问题描述】:

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

1) 用户服务实现

@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 语句执行并引发错误。

请告诉我我做错了什么。

谢谢

【问题讨论】:

    标签: java spring hibernate jpa


    【解决方案1】:

    Inserts/Updates/deletes 在 hibernate 的事务结束时总是executed(committed),这意味着 Hibernate 延迟执行插入/更新/删除直到事务结束(这是 Hibernate 的特性)。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 2016-08-05
      • 2017-02-26
      • 1970-01-01
      • 2011-08-23
      相关资源
      最近更新 更多