如何在同一笔交易中使用 javax.persistence.Query.executeUpdate() 和 org.hibernate.session.update()

how to use javax.persistence.Query.executeUpdate() and org.hibernate.session.update() in same transaction

我有一个对象形式 class x,我想通过 session.update() 更新它的属性,还有一个来自 class 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:列类型无效:16 在 oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:3963) 在 oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4596) 在 oracle.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.descriptor.sql.BasicBinder.bind(BasicBinder.java:61) 在 org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:280) 在 org.hibernate.type.AbstractStandardBasicType.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 尝试为布尔值的 JDBC 类型代码 16 绑定 null,但 Oracle 不支持。通常,布尔值在 Oracle 和 Hibernate 上建模为 char(1) 或 numeric(1)。您可以尝试通过向布尔属性添加 @Type(type = "yes_no")@Type(type = "true_false")@Type(type = "numeric_boolean") 来明确指定类型,但这通常开箱即用,因此请检查您的配置。