programing

네임스페이스(, ) - 스키마 추출에 둘 이상의 테이블이 있습니다.예외.

muds 2023. 9. 14. 00:04
반응형

네임스페이스(, ) - 스키마 추출에 둘 이상의 테이블이 있습니다.예외.

Java 애플리케이션에서 Hibernate를 사용하여 일부 값을 테이블에 유지하려고 하는 동안 이 이상한 예외에 직면했습니다.그러나 이 예외는 나머지 테이블에 대해 하나의 특정 테이블/엔티에 대해서만 발생합니다. 동면 상태를 통해 crud 작업을 수행할 수 있습니다.

Stacktrace 아래를 찾아주시고 이것이 java code와 관련된 것인지 데이터베이스 설계 오류인지 알려주시기 바랍니다.

 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)

당신의 도움에 미리 감사드립니다.

저도 같은 문제를 겪었고, 적어도 제 경우에는 원인을 알아내기 위해 코드를 파고들 수 있었습니다.같은 문제일지는 모르겠지만 도움이 될 것 같습니다.

당신의 스택 추적을 보면 당신은 hibernate.hbm2ddl를 가지고 있습니다.스키마를 업그레이드하려면 auto set을 선택합니다.그 일환으로 메타데이터 쿼리가 테이블 또는 뷰 메타데이터의 단일 행 이상을 반환하기 때문에 최대 절전 모드에서 알고 있는 모든 테이블에 대해 메타데이터를 검색하고 그 중 하나에 대해 모호한 답변을 얻도록 시도하고 있습니다.

제 경우에는 테이블에 대한 우리의 명명 규칙 때문에 발생한 일입니다."AAA_BBB"라는 테이블이 있었는데, 이 테이블이 잘못되고 있었습니다.이제 표 이름에 밑줄을 사용하는 것은 제가 아는 한 충분히 받아들일 수 있으며 매우 일반적인 관행입니다.그러나 밑줄은 단일 문자에 대한 SQL 와일드카드이기도 합니다. 데이터베이스 메타데이터의 코드를 찾아보면 DatabaseMetaData.getTables(...) 메서드에서 "WHERE table_name LIKE..."를 수행하고 있습니다. 이것이 바로 hibernate에서 사용하는 방법입니다.

제 스키마에는 "AAA1BBB"라는 두 번째 테이블도 있었습니다. 따라서 이 두 가지 테이블 모두 메타데이터 조회와 일치하여 이 테이블 각각에 대한 메타데이터 행을 반환했습니다.최대 절전 모드는 테이블 메타데이터 조회에서 설정된 결과가 하나 이상의 행을 반환하는 경우 그냥 쓰러지도록 작성됩니다.사용 가능한 행을 검사하고 지정된 테이블 이름과 정확하게 일치하는 행이 있는지 찾아야 할 것 같습니다.

동일한 결과로 Oracle과 MySQL 모두에 대해 테스트했습니다.

사유지가 동면 상태인 것 같습니다. hbm2ddl입니다.업데이트로 자동 설정이 여기서 문제를 일으키고 있습니다.최대 절전 모드 구성 xml에서 제거해 보십시오.

작동합니다.

데이터베이스 스키마 및 데이터베이스 사용자 권한을 확인합니다.

동일한 테이블 이름을 가진 다른 데이터베이스 스키마/사용자가 있고 DB 사용자가 이 테이블을 볼 수 있는 충분한 권한을 가지고 있는 경우 최대 절전 모드 업데이트 메커니즘이 실패하고 이 예외가 발생할 수 있습니다.

그래서 당신의 경우에는, 테이블 'YYYYYYYY'는 둘 이상의 데이터베이스 사용자/도식에서 찾을 수 있으며, DB 사용자는 'DBA' 권한을 가집니다.

이를 해결하기 위해 모호한 테이블을 찾아서 삭제하거나 사용자의 중복 권한을 제거할 수 있습니다.

사랑하는 RichB가 말한 것 외에 또 다른 상황이 발생할 수도 있습니다.ORACLE에서는 모든 사용자가 별도의 스키마를 가지고 있으므로 아마도 두 개의 다른 스키마에 동일한 이름을 가진 tow 테이블이 있을 것입니다. 그러면 아래 속성을 가진 persistence.xml에 기본 스키마를 지정해야 합니다.

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

을 과 함께 :@Table :

@Entity
@Table(**catalog = "MY_DB_USER"**, name = "LOOKUP")
public class Lookup implements Serializable {

}

저는 지금 이 오류가 없습니다.이 일이 잘 되길 바랍니다.

Spring Data / JPA 애플리케이션이 있었는데 Postgres 10.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;
    }

그래서 같은 문제가 발생한 후 OJDBC 드라이버를 ojdbc6에서 ojdbc8로 업데이트해야 한다는 것이 밝혀졌습니다.이것이 도움이 되기를 바랍니다.

해당 구성과 관련하여 동일한 문제가 있습니다.

@Entity
@Table(name = "NOTIFICATION")
public class Notification {
    ...
}

테이블 이름을 @Table에서 @Entity로 이동했을 때 문제가 해결되었습니다.

@Entity(name = "NOTIFICATION")
@Table
public class Notification {
    ...
}

간단히 말하면 두 개의 스키마를 사용하는 경우 이 오류가 발생합니다.이 오류를 해결하려면 다음 단계를 사용할 수 있습니다.

1. You need to delete extra schema.
2. Or u can define default schemas or that schema are u using.

spring.jpa.properties.hibernate.default_schema=nameOfSchema
and
jdbc:postgresql://localhost:5432/databaseName?currentSchema=nameOfSchema 

저도 이 문제를 발견했습니다.해결책은 다음과 같습니다.

오류: https://gist.github.com/wencheng1994

제가 해결합니다.주로 db 계정의 권한이 더 높기 때문입니다.hibernate.hbm2ddl로 설정했습니다.auto=update", 그래서 hbm2ddl이 작동하면 내가 거부한 모든 존재 shcema를 찾으려고 했습니다.그러나 이름이 같은 테이블에는 두 개의 스키마가 존재합니다.그러면 db 계정은 그것을 찾을 수 있습니다. 그래서 그것은 "이름공간에서 둘 이상의 테이블"을 찾았습니다.

다른 스키마에서 테이블을 찾을 수 없도록 db 계정을 권한을 낮추는 것만 하면 됩니다.(하나의 shcema 관계 하나의 db 계정).

언급URL : https://stackoverflow.com/questions/36907095/more-than-one-table-found-in-namespace-schemaextractionexception

반응형