java - 如何在同一事务中使用 javax.persistence.Query.executeUpdate() 和 org.hibernate.session.update()
问题描述
我有一个对象形式的类 x,我想通过 session.update() 更新它的属性,还有一个来自类 x 的对象列表,我想在同一事务中使用 query.executeUpdate() 更新其中的属性。提交事务服务器输出日志后显示此错误:
Caused by: org.hibernate.exception.GenericJDBCException: could not update: [com.net.models.hibernate.OrganizationStructure#1]
at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3241)
at org.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3090)
at org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3491)
at org.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:145)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:600)
at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:474)
at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:337)
at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1437)
... 45 more
原因:java.sql.SQLException:无效的列类型:oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4596) 的 oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3963) 的 16 .jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4578) 在 oracle.jdbc.driver.OraclePreparedStatementWrapper.setNull(OraclePreparedStatementWrapper.java:1285) 在 com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.setNull(NewProxyPreparedStatement.java :462) 在 org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280) 在 org.hibernate.type.AbstractStandardBasicType 的 org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:61)。 nullSafeSet(AbstractStandardBasicType.java:275) 在 org.hibernate.type.AbstractSingleColumnStandardBasicType。nullSafeSet(AbstractSingleColumnStandardBasicType.java:39) 在 org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2729) 在 org.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3168) ... 53更多的
解决方案
似乎您使用了某种错误的方言或配置。该错误表明 Hibernate 尝试为用于布尔null
的 JDBC 类型代码绑定 a 16
,但 Oracle 不支持。通常,布尔值在带有 Hibernate 的 Oracle 上被建模为 char(1) 或 numeric(1)。您可以尝试通过添加@Type(type = "yes_no")
,@Type(type = "true_false")
或@Type(type = "numeric_boolean")
布尔属性来显式指定类型,但这通常应该是开箱即用的,因此请检查您的配置。
推荐阅读
- ag-grid - 如何将行号显示为第一列?
- css - Bootstrap 下拉元素,里面有两个项目
- javascript - 电子表格跟踪器
- python - 从 Python 中的 Habenero API 获取错误的 Unicode
- php - 使用 POST 方法从 HTML 表单中检索 SQL 语句不会查询数据库
- antlr - ANTLR4 - 替换操作边界错误|如何使用 TokenStreamRewriter 从原始 AST 中重叠标记上的两个侦听器事件转换文本?
- html - 导航栏折叠按钮不适用于某些视图
- reactjs - componentDidUpdate 和 componentWillReceiveProps 中的 API 调用
- c++ - CURL 静态链接未解析的外部符号
- javascript - Js碰撞检测器 - 撞墙与撞地板(差异)