首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Hibernate -表或视图不存在错误

Hibernate -表或视图不存在错误
EN

Stack Overflow用户
提问于 2016-09-01 06:36:15
回答 2查看 6.2K关注 0票数 1

我正在尝试使用hibernate在数据库中保存一个对象。当我第一次使用新的表名运行代码时,它抛出下面的错误,但当我第二次运行它时,它工作得很好-

代码语言:javascript
运行
复制
    INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@61ce23ac] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Sep 01, 2016 3:51:18 AM org.hibernate.tool.schema.internal.ExceptionHandlerLoggedImpl handleException
WARN: GenerationTarget encountered exception accepting command : Error executing DDL via JDBC Statement
org.hibernate.tool.schema.spi.CommandAcceptanceException: Error executing DDL via JDBC Statement
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:62)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlString(SchemaDropperImpl.java:374)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.applySqlStrings(SchemaDropperImpl.java:359)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.dropFromMetadata(SchemaDropperImpl.java:241)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.performDrop(SchemaDropperImpl.java:154)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:126)
    at org.hibernate.tool.schema.internal.SchemaDropperImpl.doDrop(SchemaDropperImpl.java:112)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:137)
    at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:65)
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:307)
    at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:490)
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:710)
    at org.sf.main.SessionFactoryBuilder.getSessionFactory(SessionFactoryBuilder.java:26)
    at org.sf.main.SessionFactoryBuilder.main(SessionFactoryBuilder.java:36)
Caused by: java.sql.SQLSyntaxErrorException: ORA-00942: table or view does not exist

    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:447)
    at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
    at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:951)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:513)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:227)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
    at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:195)
    at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1036)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1336)
    at oracle.jdbc.driver.OracleStatement.executeInternal(OracleStatement.java:1916)
    at oracle.jdbc.driver.OracleStatement.execute(OracleStatement.java:1878)
    at oracle.jdbc.driver.OracleStatementWrapper.execute(OracleStatementWrapper.java:318)
    at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:49)
    ... 13 more

这是我的代码-

代码语言:javascript
运行
复制
    public static SessionFactory getSessionFactory() {
            Configuration configuration = new Configuration();

            configuration.setProperty("hibernate.hbm2ddl.auto", "create");
            configuration.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
            configuration.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");
            configuration.setProperty("hibernate.connection.url", "jdbc:oracle:thin:@somehost:1521:orcl");
            configuration.setProperty("hibernate.connection.username", "username");
            configuration.setProperty("hibernate.connection.password", "password");
            configuration.setProperty("show_sql", "true");
            configuration.setProperty("hibernate.default_schema", "somechema");
            configuration.setPhysicalNamingStrategy(new HelloWorldNamingStrategy());
            configuration.addAnnotatedClass(Census2010.class);

            StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder().applySettings(configuration.getProperties());
            SessionFactory sessionFactory = configuration.buildSessionFactory(builder.build()); 

            return sessionFactory;
        }

        public static void main (String[] args) {
            Census2010 obj = new Census2010();
            obj.setData(100000L);
            obj.setVariable("Population");

            SessionFactory factory = getSessionFactory();
            Session session = factory.openSession();
            session.beginTransaction();
            session.save(obj);
            session.getTransaction().commit();

            factory.close();

        }

这是我的实体类-

代码语言:javascript
运行
复制
    import javax.persistence.Column;

    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;

    @Entity
    @Table
    public class Census2010 {
        @Id
        @Column(name="VARIABLE")
        private String variable;

        @Column(name="DATA")
        private long data;

        public String getVariable() {
            return variable;
        }

        public void setVariable(String variable) {
            this.variable = variable;
        }

        public long getData() {
            return data;
        }

        public void setData(long data) {
            this.data = data;
        }
    }

下面是NamingStrategy类-

代码语言:javascript
运行
复制
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class HelloWorldNamingStrategy extends PhysicalNamingStrategyStandardImpl {

    private static final long serialVersionUID = 1L;

    private static final String tableName = "A_12345_P";

    @Override
     public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
         return new Identifier(tableName, true);
     }
}

任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2017-06-10 23:38:49

当您在hibernate.cfg.xml文件中将hbm2ddl.auto属性设置为true时,您将要求Hibernate框架创建与您试图保存的对象相对应的所有表,然后保存这些对象。

但是,在创建表之前,hibernate首先会尝试删除这些表,前提是这些表已经存在于数据库中。

因此,当您第一次运行应用程序时,由于数据库中不存在这些表,因此您将面临错误。下次运行程序时,您将不会看到上面的错误,因为这些表已经存在,hibernate将能够成功删除它们。

票数 1
EN

Stack Overflow用户

发布于 2016-09-01 08:01:21

你确定configuration.setProperty("hibernate.default_schema", "somechema");句子中的“are”是正确的shema吗?

如果是正确的,找不到表或视图。

另一种选择是使用注释,例如

代码语言:javascript
运行
复制
@Table(schema = "YOURSCHEMA", name = "Census2010")

有关更多信息,请访问https://docs.jboss.org/jbossas/jboss4guide/r2/html/ch13.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39260064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档