グーグルで試しましたが、ほぼすべてのこの種の質問に対する解決策は;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]
他に何か提供する必要があるかわかりません。提供するかどうか教えてください。よろしくお願いします。
ドレインから半時間後、誰かが同様の問題に遭遇した場合、私はようやく解決策を見つけました。
作成しようとしたときに最初にエラーがあったため、テーブルが見つかりませんでした。また、エラーは、ClassifierGroupEntityフィールドの1つがSQLの予約語の1つである「order」と名付けられたためであり、Springによって生成されたSQLステートメントは構文的に正しくありませんでした。
これらのプロパティは、src/test/resourcesフォルダーのapplication.propertiesファイルにあります。
spring.jpa.generate-ddl = true
spring.jpa.hibernate.ddl-auto = create
createが保持されないため、これを上書きする必要がありますnoneまたはvalidateが最初のddlの作成後に保持されます。
テーブルにいくつかの列を追加した後、これを取得しました。パーシスタンスジェネレーターは、エンティティにさらにいくつかのフィールドを作成しました。
私はログでこれに気づきました。
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;
}
長さ属性を削除すると、問題が解決しました。
私の場合、クエリが定義されているときに列に小文字の構文を使用していますが、H2データベースの列は大文字で定義されています。大文字と小文字の区別を無視することを期待していましたが、H2データベースには当てはまりません。
自分のアプリケーションの単体テストを書いているときにも同じ問題が発生しました。何度も試した後、アプリケーションのテストケースを実行できませんでした。バージョン1.4.191で実行していて、1.4.196にアップグレードすると機能し始めました。
私の場合、私は愚かで、実際にspring.datasource.urlを入力するのを忘れていました
なんらかの理由で、JPAは実際のデータベースURLが見つからない場合でもエラーをスローしません。変な