使用JdbcTemplate的HSQLDB,没有任何内容被保存

时间:2017-01-24 17:04:00

标签: hsqldb

由于某种原因,在对基于HSQL数据库的文件进行更改并关闭java进程后,似乎没有任何内容保存在数据库中。 I.E.我可以反复重新运行此程序,而不会遇到“表已存在”异常。到底是怎么回事?!

主要课程:

import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import java.io.IOException;
import java.sql.SQLException;

public class TestApp {

    public static void main(String[] args) throws IOException, SQLException, ClassNotFoundException {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DbConfig.class, TestDao.class);
        JdbcTemplate template = ctx.getBean(JdbcTemplate.class);
        TestDao dao = ctx.getBean(TestDao.class);
        dao.testTransactionality();
    }
}

配置:

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;

import javax.sql.DataSource;

@Configuration
public class DbConfig {

    @Bean
    public DataSource getDataSource(){
        BasicDataSource ds = new BasicDataSource();
        ds.setDriverClassName("org.hsqldb.jdbcDriver");
        ds.setUrl("jdbc:hsqldb:file:databaseFiles/test/");
        ds.setUsername("sa");
        ds.setPassword("1");
        return ds;
    }

    @Bean
    JdbcTemplate getJdbcTemplate(DataSource ds){
        return new JdbcTemplate(ds);
    }

    @Bean
    PlatformTransactionManager getTransactionManager(DataSource dataSource){
        return new DataSourceTransactionManager(dataSource);
    }
}

DAO:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;

@Repository
@EnableTransactionManagement
@Transactional
public class TestDao {

    @Autowired
    private JdbcTemplate template;

    @Transactional
    public void testTransactionality(){
        template.execute("create table LIBRARY (LIBRARY_ID INT, LIBRARY_TITLE VARCHAR(400))");
        template.execute("insert into library values (1, 'Library')");
    }
}

我尝试过使用普通的JDBC类做类似的事情以及进行显式提交,似乎没有任何帮助。我猜这是一个HSQLDB问题。请帮忙

1 个答案:

答案 0 :(得分:1)

您的数据库网址不太正确(不应以斜杠结尾)。您还应将写入延迟更改为0以查看更改:

ds.setUrl("jdbc:hsqldb:file:databaseFiles/test;hsqldb.write_delay_millis=0");