如何在同一笔交易中使用 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")
来明确指定类型,但这通常开箱即用,因此请检查您的配置。
我有一个对象形式 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")
来明确指定类型,但这通常开箱即用,因此请检查您的配置。