2016-06-08 46 views
2

我按照这个教程中mkyong.com:http://www.mkyong.com/hibernate/maven-3-hibernate-3-6-oracle-11g-example-xml-mapping/休眠:SQLGrammarException:无法执行JDBC批量更新和的BatchUpdateException:ORA-00942:表或视图不存在

但是当我运行文件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> 

请帮我谢谢你!

+2

您正在连接到'用户名'> mkyong'模式,但试图在其他模式'hibernate.default_schema“> DB11G'中创建一个表。在Oracle上是否存在这两种模式(用户)?只使用一个模式,'mykong'或'db11g',并从配置中删除'default_schema'标签会更容易。否则,您需要在'DB11g'模式中的所有表上授予Oracle用户'mykong'的'select/insert/delete'特权。 – krokodilko

+0

看起来更像配置问题,再次检查休眠配置。 – Apollo

+0

@kordirko当您在用户名“> mkyong”中调用“mkyong”时,我不明白您的观点是模式,它是模式DB11G中的用户名 –

回答

0

@kordirko我,当你在 用户名“叫“mkyong”不明白你的意思> mkyong是一个模式,它在架构中的用户名 DB11G

在甲骨文用户相当于。一个模式见定义:
https://docs.oracle.com/cd/B19306_01/server.102/b14220/schema.htm#i22627

模式是数据的逻辑结构的集合,或模式 对象的模式是拥有b是数据库用户并且与用户具有相同的名称 。每个用户拥有一个模式。

用户mykong有一个名为mykong的shema。用户DB11G有一个名为DB11G的模式。 mykong是用户和模式的名称。这同样适用于DB11G


您的配置包含下列项目:

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

这意味着,休眠连接到Oracle数据库名为mkyong一个用户,一个名为mykong架构。
如果您将mykong连接到数据库,则名为mykong的模式是此用户的默认模式。如果您发出查询SELECT * FROM tablename,那么数据库在默认情况下查找记录用户架构中名为tablename的表。

如果您以用户身份登录mykong,并且您想要访问其他用户(在其模式中)的表格 - 例如DB11G,那么您必须在模式名称前加上一个表名,例如:SELECT * FROM DB11G.tablename
但是,只有当用户DB11G(或系统)将该表上的权限授予用户mykong时,此功能才有效!


你confoiguration还包含此项:

<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会预先考虑用前缀所有查询所引用的所有obiects: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. 或者在架构上的所有表授予appriopriate权限(选择,插入,更新)到用户mykongDB11G
相关问题