我们刚刚在应用程序中升级了Hibernate 4->5。下面的代码用于Hibernate 4。有一个作业可以从MAIL_HISTORY_T获取一些数据,也可以在同一个事务中选择性地写入MAIL_HISTORY_T。
@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);
}
}
}错误:
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。
有什么想法吗?
发布于 2022-05-26 19:23:11
我们通过将写操作重写为Native 来修正这个问题。读取操作与以前一样保持不变。
因此,以前基于Hibernate的createNewMailHistory()现在是Native:
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();
}https://stackoverflow.com/questions/72174122
复制相似问题