有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在命名空间(,)SchemaExtractionException中找到多个表

在Java应用程序中使用Hibernate将一些值持久化到表中时,我遇到了这个奇怪的异常。然而,这个异常只发生在一个特定的表/实体上,对于其余的表,我可以通过Hibernate执行crud操作

请在下面的Stacktrace中找到,让我知道这是否与java代码有关,或者是数据库设计错误

 2016-04-28 11:52:34 ERROR XXXXXDao:44 - Failed to create sessionFactory object.org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : YYYYYYY
Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.XX.dao.XXXXXXXDao.main(XXXXXXXXDao.java:45)
Caused by: org.hibernate.tool.schema.extract.spi.SchemaExtractionException: More than one table found in namespace (, ) : YYYYYYY
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.processGetTableResults(InformationExtractorJdbcDatabaseMetaDataImpl.java:381)
    at org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl.getTable(InformationExtractorJdbcDatabaseMetaDataImpl.java:279)
    at org.hibernate.tool.schema.internal.exec.ImprovedDatabaseInformationImpl.getTableInformation(ImprovedDatabaseInformationImpl.java:109)
    at org.hibernate.tool.schema.internal.SchemaMigratorImpl.performMigration(SchemaMigratorImpl.java:252)
    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.<init>(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.xx.dao.zzzzzzzzzzzzDAOFactory.configureSessionFactory(zzzzzzzDAOFactory.java:43)
    at com.xx.dao.zzzzzzzzzzzzDAOFactory.buildSessionFactory(zzzzzzzzzDAOFactory.java:27)
    at com.xx.dao.XXXXXXXXDao.main(XXXXXXXXDao.java:41)

提前感谢你的帮助


共 (3) 个答案

  1. # 1 楼答案

    我也遇到过同样的问题,并且能够深入到代码中找出原因,至少在我的案例中是这样。我不知道这对你来说是否是同样的问题,但这可能会有所帮助

    从你的堆栈跟踪中,我可以看到你有休眠状态。hbm2ddl。自动设置以升级架构。作为这项工作的一部分,它正在尝试查找hibernate知道的所有表的元数据,其中一个表的答案不明确,因为元数据查询返回的不仅仅是一行表或视图元数据

    在我的例子中,这是由表的命名约定引起的。我们有一张名为“AAA_BBB”的桌子,这张桌子出了问题。现在,据我所知,在表名中使用下划线是完全可以接受的,并且是非常常见的做法。但是,下划线也是单个字符的SQL通配符;查看数据库元数据的代码,我可以看到它正在执行“WHERE table_name LIKE…”在数据库元数据中。getTables(…)方法,这就是hibernate在这里使用的方法

    现在,在我的模式中,我还有一个名为“AAA1BBB”的第二个表,因此这两个表都匹配元数据查找,因此它为每个表返回了一个元数据行。如果表元数据查找的结果集返回多行,则hibernate方法被写入fall down。我想它应该检查可用的行,并找出是否有一行与指定的表名完全匹配

    我对Oracle和MySQL进行了测试,得到了相同的结果

  2. # 2 楼答案

    我们有一个Spring Data/JPA应用程序,这个错误是在升级到Postgres10.6(从10)后开始发生的

    在我们的JPA配置类中,我们的解决方案如下:注意新的注释行

    props.put("hibernate.hbm2ddl.auto", "none"); //POSTGRES 10 --> 10.6 migration

    课程:

    @Configuration
    @EnableJpaRepositories(basePackages = "app.dao")
    @ComponentScan(basePackages = { "app.service" })
    @EnableTransactionManagement
    public class JpaConfig {
    
        @Autowired
        DataSource dataSource;
    
        @Bean
        public Map<String, Object> jpaProperties() {
            Map<String, Object> props = new HashMap<String, Object>();
            props.put("hibernate.dialect", PostgreSQL95Dialect.class.getName());
            props.put("hibernate.hbm2ddl.auto", "none"); //POSTGRES 10 --> 10.6 migration.
            return props;
        }
    
  3. # 3 楼答案

    除了亲爱的里奇所说的以外,可能还会发生另一种情况。 在ORACLE中,每个用户都有单独的模式, 因此,在两个不同的方案中,可能有两个同名的表 然后,您应该在持久化中指定默认模式。具有以下属性的xml

    <property name="hibernate.default_schema" value="username"/>