繁体   English   中英

休眠:SQLGrammarException:无法执行JDBC批更新和BatchUpdateException:ORA-00942:表或视图不存在

[英]Hibernate: SQLGrammarException: Could not execute JDBC batch update AND BatchUpdateException: ORA-00942: table or view does not exist

我在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”时,我不明白您的意思“> 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>

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

如果以mykong用户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中使用给定的架构/表空间来限定不合格的表名。 例如。 SCHEMA_NAME

上面的意思是,Hibernate将在所有查询引用的所有对象之前加上前缀DB11G. -这是模式DB11G的名称, DB11G拥有该模式的用户DB11G的名称。 也就是说-Hibernate在模式DB11G查找所有表,而不是在DB11G模式中查找所有表,而mykong实际上是已登录的日志。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM