hibernate org.h2.jdbc.JdbcSQLException:未找到表“ALL_SEQUENCES”

8tntrjer  于 2023-10-23  发布在  其他
关注(0)|答案(4)|浏览(178)

请告诉我以下错误的原因。
我在我的项目中使用Hibernate,在服务器启动过程中遇到以下错误

15:04:27.909 [localhost-startStop-1] ERROR o.h.tool.hbm2ddl.SchemaValidator - HHH000319: Could not get database metadata
org.h2.jdbc.JdbcSQLException: Table "ALL_SEQUENCES" not found; SQL statement:
 select sequence_name from all_sequences  union select synonym_name   from all_synonyms us, all_sequences asq  where asq.sequence_name = us.table_name    and asq.sequence_owner = us.table_owner [42102-168]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:329) ~[h2-1.3.168.jar:1.3.168]
    at org.h2.message.DbException.get(DbException.java:169) ~[h2-1.3.168.jar:1.3.168]
    at org.h2.message.DbException.get(DbException.java:146) ~[h2-1.3.168.jar:1.3.168]
    at org.h2.command.Parser.readTableOrView(Parser.java:4770) ~[h2-1.3.168.jar:1.3.168]
    at org.h2.command.Parser.readTableFilter(Parser.java:1084) ~[h2-1.3.168.jar:1.3.168]
    at org.h2.command.Parser.parseSelectSimpleFromPart(Parser.java:1690) ~[h2-1.3.168.jar:1.3.168]
efzxgjgh

efzxgjgh1#

如果您在persistence.xml中使用了错误的persistence-unit方言,或者针对错误的数据库进行了验证,就会发生这种情况。例如,当您针对本地H2数据库运行应用程序时,最好的选择是删除方言,因为Hibernate可以识别没有此属性的数据库(如果Hibernate的版本足够新,可以识别较新的数据库)。另一种解决方案是删除validate属性,但我不建议这样做,因为在启动时没有数据库检查:

<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
    <property name="hibernate.hbm2ddl.auto" value="validate" />
</properties>
6tr1vspr

6tr1vspr2#

我使用了多个数据源
OracleDb1Configuration

@Primary
@Bean(name = "oracleDb1EntityManager")
public LocalContainerEntityManagerFactoryBean oracleDb1EntityManagerFactory(EntityManagerFactoryBuilder builder) {
    return builder
            .dataSource(oracleDb1DataSource)
            .properties(hibernateProperties())
            .packages("com.fengxin58.user.ddd.domain.model.oracle.db1")//设置实体类所在位置
            .persistenceUnit("oracleDb1PersistenceUnit")
            .build();
}

private Map<String, Object> hibernateProperties() {

    String env = monitorService.env();
    if(log.isDebugEnabled()) {
        log.debug("current profile: {}", env);
    }
    Resource resource = null;
    if(EnvEnum.TEST.key().equals(env)) {
        resource = new ClassPathResource("hibernate-oracle-db1-test.properties");
    }else {
        resource = new ClassPathResource("hibernate-oracle-db1.properties");
    }
    try {
        Properties properties = PropertiesLoaderUtils.loadProperties(resource);
        return properties.entrySet().stream()
                .collect(Collectors.toMap(
                        e -> e.getKey().toString(),
                        e -> e.getValue())
                );
    } catch (IOException e) {
        return new HashMap<String, Object>();
    }
}

hibernate-oracle-db1-test.properties
hibernate.hbm2ddl.auto =更新
application-test.ymloracle: db1: datasource: url: jdbc:h2:mem:test driver-class-name: org.h2.Driver username: root password: db2: datasource: url: jdbc:h2:mem:test driver-class-name: org.h2.Driver username: root password:

ui7jx7zq

ui7jx7zq3#

您必须确保创建了表和序列。如果它被创造出来,它就会工作。
"ALL_SEQUENCES"未创建。请检查您的数据库是否存在?
您的问题是序列没有创建,表也没有创建。

Solution:

检查您的hibernate.cfg.xml。它没有配置好。为了澄清,我在下面给出了一个cfg file

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.h2.Driver</property>
        <property name="connection.url">jdbc:h2:database/test</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"/>

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

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">1</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.H2Dialect</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.internal.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">create</property>

        <mapping class="au.com.ozblog.hibernate.h2.example.User"/>

    </session-factory>

</hibernate-configuration>
eivgtgni

eivgtgni4#

在我的例子中,我在应用程序中使用了多个线程,并使用H2进行测试。在这种情况下,您必须手动在Java的JPA属性中设置方言,而不是通过application.properties文件。

Map<String, Object> properties = new HashMap<>();
            properties.put("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
            return builder
                    .dataSource(ds)
                    .packages("com.application.demo")
                    .properties(properties)
                    .persistenceUnit("persitenceUnit1")
                    .build();

在每一个使用过的笔记本电脑中。
万一它能帮上什么人。
问候

相关问题