首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不支持org.hibernate.UnsupportedLockAttemptException:锁模式: Hibernate 4->5升级

不支持org.hibernate.UnsupportedLockAttemptException:锁模式: Hibernate 4->5升级
EN

Stack Overflow用户
提问于 2022-05-09 15:01:40
回答 1查看 138关注 0票数 0

我们刚刚在应用程序中升级了Hibernate 4->5。下面的代码用于Hibernate 4。有一个作业可以从MAIL_HISTORY_T获取一些数据,也可以在同一个事务中选择性地写入MAIL_HISTORY_T

代码语言:javascript
复制
@Transactional(readOnly = false)
@Scheduled(cron = "${mail.cron.reviewer.task.reminder}") 
public void sendPendingReviewerTaskRemainderEmail() {
    //...
    for(Reviewers reviewer: pendingTasks) {
        // Read from MAIL_HISTORY_T
        MailHistory mh = mailHistoryDAO.getMailHistoryByReqId(reviewer.getReqId()); 
        //...
        if (someCondition) {
            // Write to MAIL_HISTORY_T
            mailHistoryDAO.createNewMailHistory(reviewer.getReqId(), params); 
        }
    }
}

错误:

代码语言:javascript
复制
org.hibernate.UnsupportedLockAttemptException: Lock mode not supported
    at org.hibernate.engine.internal.ImmutableEntityEntry.setLockMode(ImmutableEntityEntry.java:128) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.event.internal.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:220) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.event.internal.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:52) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.SessionImpl.fireRefresh(SessionImpl.java:1295) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at org.hibernate.internal.SessionImpl.refresh(SessionImpl.java:1247) ~[hibernate-core-5.6.8.Final.jar:5.6.8.Final]
    at app.mcs.dao.MailHistoryDAO.persist(MailHistoryDAO.java:40) ~[classes/:]

MAIL_HISTORY_T上的读和写操作都引用相同的请求ID。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-26 19:23:11

我们通过将写操作重写为Native 来修正这个问题。读取操作与以前一样保持不变。

因此,以前基于Hibernate的createNewMailHistory()现在是Native:

代码语言:javascript
复制
    sessionFactory.getCurrentSession().createNativeQuery("insert "
            + "    into "
            + "        MAIL_HISTORY_T "
            + "        (ID, MAIL_TEMPLATE_ID, MAIL_IDENTIFIER, REQUEST_ID, SYSTEM_COMMENTS, CREATED_DATE, CREATED_BY) "
            + "    values "
            + "        (nextval('mh_seq'), :mailTemplateId, :mailIdentifier, :requestId, :systemComments, :createdDate, :createdBy)")
        .setParameter("mailTemplateId", mailTemplateDAO.findByShortIdentifier(mailIdentifier).getId())
        .setParameter("mailIdentifier", mailIdentifier)
        .setParameter("requestId", req.getId())
        .setParameter("systemComments", systemComments)
        .setParameter("createdDate", new Date())
        .setParameter("createdBy", null)
        .executeUpdate();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72174122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档