Hibernate:SQLGrammarException:无法执行JDBC批处理更新AND BatchUpdateEx



我在mkyong.com上学习本教程:http://www.mkyong.com/hibernate/maven-3-hibernate-3-6-oracle-11g-example-xml-mapping/

但当我运行文件App.java时,它显示以下日志:

Maven + Hibernate + Oracle
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Hibernate: insert into DB11G.DBUSER (USERNAME, CREATED_BY, CREATED_DATE, USER_ID) values (?, ?, ?, ?)
Exception in thread "main" org.hibernate.exception.SQLGrammarException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:92)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at com.mkyong.App.main(App.java:22)
Caused by: java.sql.BatchUpdateException: ORA-00942: table or view does not exist
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10070)
at oracle.jdbc.driver.OracleStatementWrapper.executeBatch(OracleStatementWrapper.java:213)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 8 more

我甚至下载了示例代码并导入到Eclipse中,但它仍然显示日志。

注意:我通过以下方式更改了SID和密码:

<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@127.0.0.1:1521:DB11G</property>
<property name="hibernate.connection.username">mkyong</property>
<property name="hibernate.connection.password">mkyong123</property>
<property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
<property name="hibernate.default_schema">DB11G</property>
<property name="show_sql">true</property>
<mapping resource="com/mkyong/user/DBUser.hbm.xml"></mapping>
</session-factory>
</hibernate-configuration>

请帮帮我!谢谢你。

@kordirko当你在中调用"mkyong"时,我不明白你的意思username">mkyong是一个模式,它是模式中的用户名DB11G

在Oracle上,用户相当于一个架构。查看定义:
https://docs.oracle.com/cd/B19306_01/server.102/b14220/schema.htm#i22627

模式是数据或模式的逻辑结构的集合对象。架构由数据库用户所有,与该用户。每个用户都拥有一个模式。

用户mykong有一个名为mykong的shema。用户DB11G具有名为DB11G的模式。mykong是用户和模式的名称。DB11G也是如此。


您的配置包含以下条目:

<property name="hibernate.connection.username">mkyong</property>
<property name="hibernate.connection.password">mkyong123</property>

这意味着hibernate以名为mkyong的用户的身份连接到Oracle数据库,并连接到名为mykong的模式
如果以mykong的身份连接到数据库,则名为mykong的架构是该用户的默认架构。如果您发出查询SELECT * FROM tablename,则默认情况下,数据库会在登录用户的模式中查找名为tablename的表

如果您以用户mykong的身份登录,并且您想访问其他用户(在他的架构中)的表(比如DB11G),那么您必须在表名前面加上架构名,如下所示:SELECT * FROM DB11G.tablename
但只有当用户DB11G(或系统)将此表的权限授予用户mykong时,此操作才会起作用!


您的配置还包含以下条目:

<property name="hibernate.default_schema">DB11G</property>

此处解释此选项的含义:https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/configuration-optional.html

hibernate.default_schema
使用生成的SQL中给定的模式/表空间。例如方案名称

上面的意思是,Hibernate将为所有查询引用的所有对象预先添加前缀:DB11G.-这是架构DB11G的名称,也是拥有该架构的用户DB11G的名称。也就是说,Hibernate在DB11G模式中查找所有表,而不是在mykong模式中查找表,后者实际上是loggeg。

您可以执行以下操作之一:

  1. 以用户DB11G的身份登录,而不是以mykong的身份登录===>使用:<property name="hibernate.connection.username">DB11G</property>
  2. 从配置中删除此行:<property name="hibernate.default_schema">DB11G</property>
  3. 或者在模式DB11G上的所有表上向用户mykong授予权限(选择、插入、更新)

最新更新