我使用 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/