web-dev-qa-db-ja.com

java h2インメモリデータベースエラー:テーブルが見つかりません

グーグルで試しましたが、ほぼすべてのこの種の質問に対する解決策は;DB_CLOSE_DELAY=-1を追加することでしたが、それは私にとって何も解決しません。

これが私のテストクラスです

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {Main.class})
public class Testas {

    @Autowired
    @Qualifier("managerImplementation")
    private ClassifierManager manager;

    @Test
    public void testManager(){
        ClassifierGroupEntity cge = new ClassifierGroupEntity();
        manager.saveClassifierGroup(cge);
    }
}

マネージャークラス

@Service("managerImplementation")
public class ClassifierManagerImpl implements ClassifierManager{

    @Autowired
    private ClassifierGroupEntityRepository groupEntityRepository;

    @Autowired
    private ClassifierEntityRepository entityRepository;

    @Autowired 
    private ClassifierValueEntityRepository valueEntityRepository;

    @Override
    public ClassifierGroupEntity getClassifierGroup(long id) {
        return groupEntityRepository.findOne(id);
    }

    @Override
    public ClassifierGroupEntity getClassifierGroup(String code) {
        return groupEntityRepository.findByCode(code);
    }

    @Override
    public ClassifierGroupEntity saveClassifierGroup(ClassifierGroupEntity entity) {
        return groupEntityRepository.save(entity);
    }

    @Override
    public void deleteClassifierGroup(long id) {
        groupEntityRepository.delete(id);
    }

    @Override
    public ClassifierEntity getClassifier(long id) {
        return entityRepository.findOne(id);
    }

    @Override
    public ClassifierEntity getClassifier(String code) {
        return entityRepository.findByCode(code);
    }

    @Override
    public ClassifierEntity saveClassifier(ClassifierEntity entity) {
        return entityRepository.save(entity);
    }

    @Override
    public void deleteClassifier(long id) {
        entityRepository.delete(id);
    }

    @Override
    public ClassifierValueEntity getClassifierValue(long id) {
        return valueEntityRepository.findOne(id);
    }

    @Override
    public ClassifierValue getClassifierValue(String classifiedCode, String valueCode) {
        return null;
    }

    @Override
    public ClassifierValueEntity saveClassifierValue(ClassifierValueEntity entity) {
        return valueEntityRepository.save(entity);
    }

    @Override
    public void deleteClassifierValue(long id) {
        valueEntityRepository.delete(id);
    }


}

そして最後にプロパティファイル

spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.user=sa
spring.datasource.password=
spring.datasource.url=jdbc:h2:mem:test;DB_CLOSE_DELAY=-1

テストを起動すると、

org.h2.jdbc.JdbcSQLException: Table "CLASSIFIER_GROUP_ENTITY" not found; SQL statement:
insert into classifier_group_entity (id, code, modified_details, modified_time, modified_user_id, order, revision, valid_details, valid_from, valid_till, parent_id) values (null, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [42102-191]

他に何か提供する必要があるかわかりません。提供するかどうか教えてください。よろしくお願いします。

7

ドレインから半時間後、誰かが同様の問題に遭遇した場合、私はようやく解決策を見つけました。

作成しようとしたときに最初にエラーがあったため、テーブルが見つかりませんでした。また、エラーは、ClassifierGroupEntityフィールドの1つがSQLの予約語の1つである「order」と名付けられたためであり、Springによって生成されたSQLステートメントは構文的に正しくありませんでした。

13

これらのプロパティは、src/test/resourcesフォルダーのapplication.propertiesファイルにあります。

spring.jpa.generate-ddl = true

spring.jpa.hibernate.ddl-auto = create

createが保持されないため、これを上書きする必要がありますnoneまたはvalidateが最初のddlの作成後に保持されます。

10
Ankit Bhatnagar

テーブルにいくつかの列を追加した後、これを取得しました。パーシスタンスジェネレーターは、エンティティにさらにいくつかのフィールドを作成しました。

私はログでこれに気づきました。

ERROR 13691 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : HHH000389: Unsuccessful: create table comment
ERROR 13691 --- [           main] org.hibernate.tool.hbm2ddl.SchemaExport  : Scale($"0") must not be bigger than precision("-1")

私のIDEの永続化ジェネレーターがTEXTフィールドをマップしたときに、長さが-1であることがわかりました。

@Basic
@Column(name = "address", nullable = true, length = -1)
public String getAddress() {
  return address;
}

長さ属性を削除すると、問題が解決しました。

1
Omoloro

私の場合、クエリが定義されているときに列に小文字の構文を使用していますが、H2データベースの列は大文字で定義されています。大文字と小文字の区別を無視することを期待していましたが、H2データベースには当てはまりません。

0
newday

自分のアプリケーションの単体テストを書いているときにも同じ問題が発生しました。何度も試した後、アプリケーションのテストケースを実行できませんでした。バージョン1.4.191で実行していて、1.4.196にアップグレードすると機能し始めました。

0
Shreyash

私の場合、私は愚かで、実際にspring.datasource.urlを入力するのを忘れていました

なんらかの理由で、JPAは実際のデータベースURLが見つからない場合でもエラーをスローしません。変な

0
Nick08