Kotlin Exposed不提交交易

遵循Exposed上提供的示例,我无法读取创建它的事务外部创建的表/数据。 我正在使用h2-in-memory数据库。

例外是:

Exception in thread "main" org.h2.jdbc.JdbcSQLException: Table "CITIES" not found; SQL statement: 

我已经添加了一个调用提交,但这没有帮助。 如果我读取创建数据的事务中的数据,如链接到github的示例中,它工作正常。 这里是它的一个简化版本:

 fun main(args: Array<String>) { Database.connect("jdbc:h2:mem:test", driver = "org.h2.Driver") transaction { create(Cities) City.new { name = "St. Petersburg" } println("Cities: ${City.all().joinToString { it.name }}") //I have added this commit here commit() } //I want to read the data outside the transaction, but it does not work transaction { println("Cities: ${City.all().joinToString { it.name }}") } } 

我怎样才能坚持数据?

添加logger.addLogger(StdOutSqlLogger)会提供以下输出:

 SQL: CREATE TABLE IF NOT EXISTS CITIES (ID INT AUTO_INCREMENT PRIMARY KEY, NAME VARCHAR(50) NOT NULL) SQL: INSERT INTO CITIES (NAME) VALUES ('St. Petersburg') SQL: SELECT CITIES.ID, CITIES.NAME FROM CITIES 

它确实进行交易。 问题是当内存数据库关闭时,它被删除,内存数据库在下列情况下被关闭:

默认情况下,H2在最后一次连接关闭时关闭数据库

资源

这是一个图表,所以更容易理解一步一步地发生了什么(当数据库关闭时,它被完全删除)

图

最简单的解决方案是简单地使用实际的文件数据库而不是内存。

将内存中的DB更改为Database.connect("jdbc:h2:~/test", driver = "org.h2.Driver")修复了这个问题。