java h2内存数据库错误:找不到表

时间:2016-04-15 13:56:45

标签: java spring jdbc 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]

我不知道是否应该提供其他任何东西,如果我这样做,请告诉我。我提前感谢您的帮助。

9 个答案:

答案 0 :(得分:10)

在流失了半小时后,我终于找到了解决办法,如果有人遇到类似的问题。

找不到表,因为在尝试创建表时开始时出错。并且错误是由于其中一个ClassifierGroupEntity字段被命名为'order',这是SQL中的保留字之一,因此Spring生成的SQL语句在语法上是不正确的。

答案 1 :(得分:7)

在src / test / resources文件夹中的 application.properties 文件中包含以下属性:

<强> spring.jpa.generate-DDL =真

<强> spring.jpa.hibernate.ddl-自动=创建

这必须过度使用,因为在第一次创建ddl后,它不会保留创建而是保留 none 验证

答案 2 :(得分:3)

在编写集成测试之前,我始终对H2数据库,Flyway,Spring Boot JPA使用以下配置-https://gist.github.com/vslala/d412156e5840fafa1b9f61aae5b20951

在您的src/test/resources/application.properties文件中放入以下配置。

# Datasource configuration for jdbc h2
# this is for file based persistent storage
# spring.datasource.url=jdbc:h2:file:/data/demo

# For in-memory storage
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MySQL;DB_CLOSE_DELAY=-1;IGNORECASE=TRUE;
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=vslala
spring.datasource.password=simplepass
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect

# This has to be over-ridden because
# it's not kept create rather kept none or validate after the first ddl creation.
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=create

# This is for FlyWay configuration
spring.flyway.url=jdbc:h2:mem:testdb
spring.flyway.schemas=testdb
spring.flyway.user=vslala
spring.flyway.password=simplepass

答案 3 :(得分:1)

我在我的桌子上添加几列后得到了这个。持久性生成器在我的实体中创建了更多的字段。

我在日志中注意到了这一点。

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;
}

删除length属性解决了我的问题。

答案 4 :(得分:0)

我在为自己的应用程序编写单元测试时遇到了同样的问题。经过多次尝试,我无法运行应用程序测试用例。我在1.4.191版本上运行,然后升级到1.4.196并开始工作。

答案 5 :(得分:0)

在我的情况下,我很笨,却忘了实际放入 spring.datasource.url

由于某种原因,JPA如果找不到实际的数据库URL,则不会引发错误。奇怪

答案 6 :(得分:0)

就我而言,定义查询时我对列使用小写语法,但H2数据库中的列以大写定义。我原本希望忽略大小写,但是H2数据库却不是这种情况。

答案 7 :(得分:0)

请尝试解决此问题-

p1 <- ggplot(subset(Data.df,ID %in% c("9" , "11")))
p1 <- p1 + geom_point(aes(dt, d, colour=as.factor(ID), shape=as.factor(ID)))
p1 <- p1 + scale_shape_manual(values=c(3, 6))
p1 <- p1 + scale_color_manual(values=c("red", "blue"))
p1

答案 8 :(得分:0)

我参加聚会可能有点晚了,但我遇到了完全相同的错误,我尝试了这里和其他网站上提到的几乎所有解决方案,例如 DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1; DB_CLOSE_ON_EXIT=假;忽略情况=真

但对我来说没有任何效果。 对我有用的是将 data.sql 重命名为 import.sql

我在这里找到的 - https://stackoverflow.com/a/53179547/8219358

对于 Spring Boot 2.4+,在 application.properties 中使用 spring.jpa.defer-datasource-initialization=true(此处提到 - https://stackoverflow.com/a/68086707/8219358

我意识到其他解决方案更合乎逻辑,但没有一个对我有用,而这确实有效。