java - 解决 EclipseLink @Version Timestamp-Field 和 DB2 之间冲突的最佳方法
问题描述
在我正在处理的当前项目中,我们使用EclipseLink 作为 JPA-Provider。在后台是一个DB2 数据库。
我们想引入“乐观锁定”,仅使用Timestamp-fields进行限制。此外,这些时间戳字段是 CURRENT TIMESTAMP 字段,因此在更新实体时,CURRENT TIMESTAMP 字段会更新值本身。这是保证整个系统的可靠性所必需的。
使用 @Version 注释实体的属性时,我收到以下错误消息:
内部异常:com.ibm.websphere.ce.cm.StaleConnectionException:不支持 SQL 语句。SQLCODE=-142,SQLSTATE=42612,DRIVER=4.22.29
错误代码:-142
调用:VALUES CURRENT TIMESTAMP
查询:在
org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl$1 上的 ValueReadQuery(sql="VALUES CURRENT TIMESTAMP")。
org.eclipse.persistence.transaction.AbstractSynchronizationListener.handleException(AbstractSynchronizationListener.java:275)处的 handleException(EntityManagerSetupImpl.java:767 ) […]
注意:我只在使用提到的注释时收到此错误消息。
我的研究结果如下:
- 内部异常:com.ibm.websphere.ce.cm.StaleConnectionException:--> StaleConnectionException 是当 JDBC 驱动程序从连接请求或操作返回致命错误时由 WebSphere Application Server 数据库连接代码生成的异常。在 WebSphere Application Server 中,当数据库供应商发出异常指示当前位于连接池中的连接不再有效时,就会发出 StaleConnectionException。(https://developer.ibm.com/answers/questions/205910/how-to-resolve-the-staleconnectionexception-in-web/)
- 不支持 SQL 语句。SQLCODE=-142, --> 检测到数据库不支持的 SQL 语句。该语句可能对其他 IBM® 关系数据库产品有效,也可能在其他上下文中有效。例如,诸如 VALUES和 SIGNAL 或 RESIGNAL SQLSTATE 之类的语句只能在某些上下文中使用,例如在触发器主体或 SQL 过程中。(https://www.ibm.com/support/knowledgecenter/en/SSEPEK_10.0.0/codes/src/tpc/n142.html)
- SQLSTATE=42612,
--> 似乎是内部的,与我无关
在深入了解该主题后,我发现了以下链接,这是迄今为止最令人鼓舞的链接:
https
://www.idug.org/p/fo/et/thread=36380
总之,建议的方法是扩展 org.eclipse.persistence.platform.database.DB2MainframePlatform 并操作生成的 SQL 语句。
我的期望是,应该有更好的方法,因为这应该是框架的标准案例。如果没有,是否有更合适/更好的方法来解决这个问题?
解决方案
推荐阅读
- mybatis - MyBatis 映射器不加载查询
- python - 我被困在 Coursera 上的作业。我的输出是正确的,但它仍然给我一个“不匹配”错误。请问,谁能帮帮我?
- python - 连接问题——Python
- c++ - 找到复向量中的最低实数值
- python - 如何在不使用pandas df.groupby和.rank的情况下根据日期使用for循环语句对表进行排名?
- sql - 在 Postgres 11 中的表中自动创建分区
- python - 使用seaborn将字典值映射为python热图中的标签
- css - 您可以仅添加与分辨率无关的桌面 CSS 吗?
- google-cloud-firestore - TypeError:无法解构“boundActionCreators”的属性“createNode”,因为它未定义
- php - 使用正则表达式自定义 realpath()