【问题标题】:org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute commandorg.hibernate.tool.schema.spi.CommandAcceptanceException:无法执行命令
【发布时间】:2016-08-20 12:07:04
【问题描述】:

我是休眠新手,并试图在 oracle db 中映射一个已经创建的表。在下面给出的代码中:

Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();

String hql = "FROM CrbtSubMasterDemo where rownum<20";
Query query = session.createQuery(hql);

List itr = query.list();
session.getTransaction().commit();

for (Iterator iterator = itr.iterator(); iterator.hasNext();)
{
System.out.println("[" + iterator.next() + "]");
}

当我运行这段代码时。它首先给出了这个异常:


Apr 26, 2016 8:10:47 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: sdp.crbt_subscriber_master
Hibernate: create table sdp.crbt_subscriber_master (MSISDN varchar2(255) not null, STATUS varchar2(255), DATE_REGISTERED date, PLAN_INDICATOR number(10,0), RBT_CODE number(10,0), PASSWORD varchar2(255), TPIN varchar2(255), FREE_EVENTS_USED number(10,0), BLACK_LISTED number(10,0), LANGUAGE number(10,0), DEFAULT_GROUP_SETTING varchar2(255), DEFAULT_SINGLE_SETTING varchar2(255), DATE_SETTING_VALIDITY number(10,0), IMSI varchar2(255), LAST_CHARGED date, IS_MONTHLY_CHARGEABLE varchar2(255), CORP_ID number(10,0), SUB_TYPE varchar2(255), RENEW_MODE number(10,0), EXPIRY_DATE date, ACTIVE_FEATURES number(10,0), IN_USE_RBT number(10,0), UPDATE_TIME date, CORP_EXPIRY date, primary key (MSISDN))
Apr 26, 2016 8:10:47 PM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Unable to execute command [create table sdp.crbt_subscriber_master (MSISDN varchar2(255) not null, STATUS varchar2(255), DATE_REGISTERED date, PLAN_INDICATOR number(10,0), RBT_CODE number(10,0), PASSWORD varchar2(255), TPIN varchar2(255), FREE_EVENTS_USED number(10,0), BLACK_LISTED number(10,0), LANGUAGE number(10,0), DEFAULT_GROUP_SETTING varchar2(255), DEFAULT_SINGLE_SETTING varchar2(255), DATE_SETTING_VALIDITY number(10,0), IMSI varchar2(255), LAST_CHARGED date, IS_MONTHLY_CHARGEABLE varchar2(255), CORP_ID number(10,0), SUB_TYPE varchar2(255), RENEW_MODE number(10,0), EXPIRY_DATE date, ACTIVE_FEATURES number(10,0), IN_USE_RBT number(10,0), UPDATE_TIME date, CORP_EXPIRY date, primary key (MSISDN))]
org.hibernate.tool.schema.spi.CommandAcceptanceException: Unable to execute command [create table sdp.crbt_subscriber_master (MSISDN varchar2(255) not null, STATUS varchar2(255), DATE_REGISTERED date, PLAN_INDICATOR number(10,0), RBT_CODE number(10,0), PASSWORD varchar2(255), TPIN varchar2(255), FREE_EVENTS_USED number(10,0), BLACK_LISTED number(10,0), LANGUAGE number(10,0), DEFAULT_GROUP_SETTING varchar2(255), DEFAULT_SINGLE_SETTING varchar2(255), DATE_SETTING_VALIDITY number(10,0), IMSI varchar2(255), LAST_CHARGED date, IS_MONTHLY_CHARGEABLE varchar2(255), CORP_ID number(10,0), SUB_TYPE varchar2(255), RENEW_MODE number(10,0), EXPIRY_DATE date, ACTIVE_FEATURES number(10,0), IN_USE_RBT number(10,0), UPDATE_TIME date, CORP_EXPIRY date, primary key (MSISDN))]
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:63)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlString(SchemaMigratorImpl.java:567)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.applySqlStrings(SchemaMigratorImpl.java:551)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.createTable(SchemaMigratorImpl.java:339)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.performMigration(SchemaMigratorImpl.java:257)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:137)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.doMigration(SchemaMigratorImpl.java:110)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:176)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:64)
    at org.hibernate.internal.SessionFactoryImpl.(SessionFactoryImpl.java:458)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:465)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:708)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724)
    at com.telemune.demoHibernate.QueryTester.(QueryTester.java:17)
    at com.telemune.demoHibernate.QueryTester.main(QueryTester.java:21)
Caused by: java.sql.SQLException: ORA-00955: name is already used by an existing object

    at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
    at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:210)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:961)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1190)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1726)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1696)
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:51)
    ... 14 more

Apr 26, 2016 8:10:47 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: sdp.crbt_subscriber_master
Apr 26, 2016 8:10:47 PM org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl processGetTableResults
INFO: HHH000262: Table not found: sdp.crbt_subscriber_master

然后成功显示所需的结果。 但我想知道异常的原因。寻求帮助。我只知道一些关于hibenate的事情,如果这是一个愚蠢的问题,对不起。

sdp 是数据库的名称。这是我的映射:

;

【问题讨论】:

    标签: java oracle hibernate


    【解决方案1】:

    这里的表名区分大小写。不匹配。

    INFO: HHH000262: Table not found: sdp.crbt_subscriber_master
    

    数据库正在尝试获取crbt_subscriber_master,但你已经给出了

    String hql = "FROM CrbtSubMasterDemo where rownum
    

    您的问题在这里:

    还有另一个问题。您错过了完美添加声明 hql。

    使用此代码

    String hql = "FROM CrbtSubMasterDemo where rownum";
    

    而不是

    String hql = "FROM CrbtSubMasterDemo where rownum
    

    您也可以阅读本教程:ORA-00955: name is already being used by existing object tips


    更新:

    hibernate.hbm2ddl.auto 自动验证或导出模式 DDL 创建 SessionFactory 时到数据库。使用创建删除, 当 SessionFactory 关闭时,数据库模式将被删除 明确的。

    例如验证 |更新 |创建 |创建删除

    所以可能的选项列表是,

    validate:验证架构,不更改数据库。

    更新:更新架构。

    create:创建架构,销毁以前的数据。

    create-drop:在会话结束时删除架构。

    所以,因为它已经创建了数据表。那么如果你从你的配置中移除这个属性,那么它就会被解决。

    <property name="hbm2ddl.auto">update</property>
    

    但是你可以试一试。这也将解决问题。

    <property name="hbm2ddl.auto">validate</property>
    

    <property name="hbm2ddl.auto">none</property>
    

    有时空字符串' 比'none' 好得多。要使用“无”,您将收到warning message: org.hibernate.cfg.SettingsFactory - Unrecognized value for "hibernate.hbm2ddl.auto": none

    【讨论】:

    • 我添加的行是:String hql = "FROM CrbtSubMasterDemo where rownum 我不知道为什么它没有显示整行... . 这是试图获取 crbt_subscriber_master 因为这是映射表的名称与 CrbtSubMasterDemo pojo 类@SkyWalker
    • sdp 是数据库的名称。这是我的映射:
    • 其实你的问题是表已经存在,需要再次调用创建。所以你必须检查它是否存在表然后删除它然后尝试创建它。
    • @yashpalbharadwaj 要解决 ORA-00955,请确保为数据库对象提供不匹配的名称。您还可以删除或修改现有对象,以便可以重复使用它,而不必使用相同的语法。
    • 为什么这被称为 create table sdp.crbt_subscriber_master 更多次是你的问题。
    【解决方案2】:

    我认为问题在于您在此处指定了带有表名的架构名称

    <class name="com.telemune.demoPojo.CrbtSubMasterDemo" 
      table="sdp.crbt_subscriber_master">
    

    Hibernate 将sdp.crbt_subscriber_master 视为表名。

    但当 Hibernate 尝试执行 create table sdp.crbt_subscriber_master() 时,Oracle 将 sdp 视为架构名称,将 crbt_subscriber_master 视为表名称。

    不知道如何为映射指定架构名称,但您可以按照此处所述尝试

    Chapter 5. Basic O/R Mapping: mapping-declaration-class

    <class name="com.telemune.demoPojo.CrbtSubMasterDemo" 
      schema="sdp" table="crbt_subscriber_master">
    

    【讨论】:

    • 是的,你可能是对的,但我应该如何解决它,这样它就不会出现异常?
    • @yashpalbharadwaj 请看一个映射示例:)
    • 顺便说一句,这是一个更简单的...谢谢@v.ladynev先生。请先生,您能否解释一下上述事实,当我将 update 替换为 none 时,它​​解决了异常问题。如何?它适用于所有其他查询吗??
    • @yashpalbharadwaj update = none 表示 Hibernate 在处理映射时不会更新数据库模式(看起来没有 none 值,您可以简单地评论或删除 hibernate.hbm2ddl.auto )。这不是任何异常,因为 Hibernate 不会尝试创建表。
    • @v.ladynev 先生。 v.ladynev 我如何直接向您询问有关休眠的进一步问题?
    猜你喜欢
    • 2020-06-19
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2019-08-04
    • 2021-03-25
    • 1970-01-01
    相关资源
    最近更新 更多