복붙노트

[SPRING] org.dbunit.dataset.NoSuchTableException : 'null'스키마에서 'xxx'테이블을 찾지 못했습니다.

SPRING

org.dbunit.dataset.NoSuchTableException : 'null'스키마에서 'xxx'테이블을 찾지 못했습니다.

dbunit에 대한 논의가있었습니다. 나는 그들 중 대부분을 읽었지만 내 문제에 대한 해결책을 찾지 못하는 것 같습니다.

나는 최대 절전 모드와 스프링을 설치했다. 나는 코드를 작성하기 전에 적절한 DAO 테스트 프레임 워크를 연결해야하므로 TDD를하고있다. Dbunit이 마음에 떠올랐다. 나는 그것을 설치해야했다. 다음은 ma testdataset.xml입니다.

    <?xml version='1.0' encoding='UTF-8'?>
    <dataset>
        <table name="status">
            <column>statusId</column>
            <column>status</column>
            <row>
                <value>0</value>
                <value>Available</value>
            </row>
        </table>
        <table name="user">
            <column>userId</column>
            <column>firstName</column>
            <column>lastName</column>
            <column>username</column>
            <column>password</column>
            <column>email</column>
            <row>
                <value>0</value>
                <value>system</value>
                <value>admin</value>
                <value>admin</value>
                <value>admin</value>
                <value>admin@ccbs.com</value>
            </row>
        </table>
        <table name="reservation">
            <column>reservationId</column>
            <column>userId</column>
            <column>reservationDate</column>
            <column>startDate</column>
            <column>endDate</column>
            <column>statusId</column>
            <row>
                <value>0</value>
                <value>0</value>
                <value>2011-02-20 12:46:00.0</value>
                <value>2011-03-01 12:00:00.0</value>
                <value>2011-04-01 12:00:00.0</value>
                <value>0</value>
            </row>
        </table>
    </dataset>

모든 데이터 집합을로드하는 기본 클래스를 사용하여 일부 코드를 연결하려고 할 때까지 잘 보인다. 여기 내 코드가 있습니다 :

@Transactional
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:test-applicationContext.xml" })
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
public class BaseContextSensitiveTest {

    @BeforeClass
public static void setUpDatabase() throws Exception {
    URL file = getInitalDatasetURL();
    testDataset = createDataset(file);
}

   @Before
public void init() throws Exception {
    log.info("Initializing Data Set");
    connection = createDBUnitConnection();

    DatabaseOperation.CLEAN_INSERT.execute(connection, testDataset);
}

private static URL getInitalDatasetURL() throws FileNotFoundException {
    URL file = ClassLoader.getSystemResource(TEST_DATASET_LOCATION);
    if (file == null) {
        throw new FileNotFoundException("Unable to find '"
                + TEST_DATASET_LOCATION + "' in the classpath");
    }
    return file;
}

private static IDataSet createDataset(URL file) throws IOException,
        DataSetException {

    return new XmlDataSet(file.openStream());
}

private IDatabaseConnection createDBUnitConnection()
        throws DatabaseUnitException, SQLException {

    Connection connection = getConnection();
    IDatabaseConnection dbUnitConn = new DatabaseConnection(connection);

    // use the hsql datatypefactory so that boolean properties work
    // correctly
    DatabaseConfig config = dbUnitConn.getConfig();
    config.setProperty(DatabaseConfig.PROPERTY_DATATYPE_FACTORY,
            new HsqldbDataTypeFactory());

    return dbUnitConn;
}

DatabaseOperation.CLEAN_INSERT.execute (connection, testDataset)에 도달하자마자; 다음 예외가 throw됩니다.

org.dbunit.dataset.NoSuchTableException: Did not find table 'USER' in schema 'null'
at org.dbunit.database.DatabaseTableMetaData.<init>(DatabaseTableMetaData.java:142)
at org.dbunit.database.DatabaseDataSet.getTableMetaData(DatabaseDataSet.java:290)
at org.dbunit.operation.DeleteAllOperation.execute(DeleteAllOperation.java:109)
at org.dbunit.operation.CompositeOperation.execute(CompositeOperation.java:79)
at com.cottage.test.BaseContextSensitiveTest.init(BaseContextSensitiveTest.java:64)

모든 최대 절전 모드 매핑 파일을 제자리에두고 데이터베이스가 이미 데이터없이 설정되었습니다. 재미있는 일 (또는 당신이 그것을 보는 방법에 따라 성가신 일)은 내가 데이터 집합의 테이블 순서를 변경하면, missingtableexception은 다른 테이블 ... 사용자, 예약 또는 상태 중 하나를 불평한다는 것입니다.

내가 뭘 잘못하고 있을지에 대한 제안?

해결법

  1. ==============================

    1.나는 또한이 같은 오류를 우연히 만났으며 위의 허용 된 수정이 내 문제를 해결하지 못했습니다. 그러나 나는 해결책을 발견 할 수 있었다.

    나는 또한이 같은 오류를 우연히 만났으며 위의 허용 된 수정이 내 문제를 해결하지 못했습니다. 그러나 나는 해결책을 발견 할 수 있었다.

    내 설정은 내 JPA 공급자 인 DBUnit (2.4), EclipseLink (2.1) 및 백엔드 데이터베이스 인 Postgres로 구성됩니다. 또한, 제 시나리오에서는 각 테스트 실행을 위해 테이블을 삭제하고 다시 작성하지 않았습니다. 내 테스트 데이터가 이미 존재했습니다. 내가 아는 나쁜 습관이지만 테스트 / 프로토 타입 시나리오에 가깝습니다. 아래 코드는 내 문제를 해결하는 데 사용 된 DBUnit 구성을 보여줍니다.

    54    // ctx represents a spring context
    55    DataSource ds = (DataSource)ctx.getBean("myDatasourceBean");
    56    Connection conn = DataSourceUtils.getConnection(ds);
    57    IDatabaseConnection dbUnitConn = new DatabaseConnection(conn, "public");
    58    DatabaseConfig dbCfg = dbUnitConn.getConfig();
    59    dbCfg.setFeature(DatabaseConfig.FEATURE_CASE_SENSITIVE_TABLE_NAMES, Boolean.TRUE);
    60    IDataSet dataSet = new FlatXmlDataSet(ClassLoader.getSYstemResourceAsStream("mydbunitdata.xml"));
    61    DatabaseOperation.REFRESH.execute(dbUnitConn, dataSet);
    

    위의 코드에서 두 가지 문제가 해결되었습니다. 먼저 DBUnit이 사용해야하는 스키마를 정의해야했습니다. 그것은 위의 57 행에 있습니다. 새 DatabaseConnection이 설정되면 null이 아닌 경우 스키마 ( "public")가 전달되어야합니다.

    둘째, DBUnit을 사용하여 데이터베이스 테이블 이름에 대소 문자를 구분해야했습니다. 내 DBUnit XML 파일 ( "mydbunitdata.xml")에서 테이블 이름은 데이터베이스에있는 것처럼 모두 소문자입니다. 그러나 대소 문자 구분 테이블 이름을 사용하도록 DBUnit에 지시하지 않으면 Postgres가 싫어하는 대문자 테이블 이름을 찾습니다. 따라서 59 행에서 DBUnit의 대소 문자를 구분하는 기능을 설정해야했습니다.

  2. ==============================

    2.dataset.xml 파일의 첫 번째 행을 제거하십시오.

    dataset.xml 파일의 첫 번째 행을 제거하십시오.

    이것을 이걸로 바꿔라.

    그렇지 않으면 DBUnit은 DTD 파일에서 db 테이블 스키마를로드하려고 시도하고 DTD가 제공되지 않으면 어떤 테이블에서도 일치하지 않습니다. 일반 xml 헤더를 사용하면 DBUnit가이 오류를 던지고있는이 DTD 테이블 검사를 건너 뜁니다.

    당신은 또한 Grzegorz가 한 일을하고 최대 절전 모드를 포함 시켜서 테이블을위한 작성 드롭을해야합니다.

    또는

    configuration.setProperty (Environment.HBM2DDL_AUTO, "create-drop");

  3. ==============================

    3.DBUnit은 의도 된 데이터베이스 스키마를 생성하기 위해 데이터 세트 xml의 정보가 제한되어 있기 때문에 데이터베이스 테이블을 생성하지 않습니다.

    DBUnit은 의도 된 데이터베이스 스키마를 생성하기 위해 데이터 세트 xml의 정보가 제한되어 있기 때문에 데이터베이스 테이블을 생성하지 않습니다.

    최대 절전 모드와 함께 사용하면 메모리 테스트 데이터베이스 테이블에 매핑하려는 모든 pojo에 대해 적절한 hbm 매핑 파일이 필요하며 이는 궁극적으로 테스트에 사용됩니다. 매핑 파일이 없으면 org.dbunit.dataset.NoSuchTableException이 발생합니다 : 'yyy'스키마에서 'xxx'테이블을 찾지 못했습니다.

    또한 모든 hibernate 매핑 파일로 올바르게 구성된 유효한 hibernate.cfg.xml이 필요합니다.

    프로퍼티 파일에서이 프로퍼티 hibernate.hbm2ddl.auto = create-drop을 설정함으로써 데이터베이스 생성을 최대 절전 모드로 위임 할 수있다.

    오류 메시지는 약간 오도 된 것입니다. 아마도 hibernate 매핑 파일이 누락 된 결과에 대한 더 많은 정보를 포함해야합니다. 그러나 이것은 DBunit 위키에 대한 토론입니다.

  4. ==============================

    4.데이터베이스에 데이터베이스 테이블을 만들었습니까?

    데이터베이스에 데이터베이스 테이블을 만들었습니까?

    dbunit은 의도 된 데이터베이스 구조를 알지 못하기 때문에 당신을 위해 그것을하지 않습니다. 그러나 당신은 그것을하기 위해 Hibernat에게 질문 할 수있다. hbm2ddl 플래그를 사용하십시오 (예 :

     <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
    

    플래그에 대한 주요 문서를 찾을 수 없지만 검색 한 경우 많은 결과를 얻을 수 있습니다. http://docs.jboss.org/ejb3/docs/reference/build/reference/en/html/entityconfig.html

  5. ==============================

    5.이것에 관심이 있습니다. 나는 또한이 오류를 발견하고 hibernate.cfg.xml에서 'message'에서 'MESSAGE'로 내 테이블의 이름을 변경함으로써 스키마를 찾을 수있었습니다.

    이것에 관심이 있습니다. 나는 또한이 오류를 발견하고 hibernate.cfg.xml에서 'message'에서 'MESSAGE'로 내 테이블의 이름을 변경함으로써 스키마를 찾을 수있었습니다.

    이게 너에게 효과가 있는지 알려줘.

  6. ==============================

    6.동일한 오류가 발생하여 hibernate.cfg.xml에 내 엔티티가 구성되어 있고 hbm2ddl을 사용하여 테이블을 생성 했으므로 검색 한 결과 내 엔티티 매핑에 예약 된 용어 인 "POSITION"이라는 필드가 포함되어 있음을 발견했습니다 . "POS"로 변경하면 테이블이 올바르게 생성되었습니다.

    동일한 오류가 발생하여 hibernate.cfg.xml에 내 엔티티가 구성되어 있고 hbm2ddl을 사용하여 테이블을 생성 했으므로 검색 한 결과 내 엔티티 매핑에 예약 된 용어 인 "POSITION"이라는 필드가 포함되어 있음을 발견했습니다 . "POS"로 변경하면 테이블이 올바르게 생성되었습니다.

    resultSet 반복을 디버깅하여 테이블이 생성되는지 확인할 수 있습니다.

    org.dbunit.database.DatabaseDataSet.initialize ().

  7. from https://stackoverflow.com/questions/5066201/org-dbunit-dataset-nosuchtableexception-did-not-find-table-xxx-in-schema-nul by cc-by-sa and MIT license