我试图用内存中的数据库来测试JDBC客户机,这样我就可以用单元测试来测试各种情况。
以下是我目前掌握的信息:
@Entity
@Table(name = "table_name")
public class MyModel {
public class MyModelClient {
private final Connection con;
public MyModelClient(String url, String user, String password) {
try {
con = DriverManager.getConnection(url, user, password);
} catch (SQLException e) {
throw new RuntimeException("uh oh", e);
}
}
public Connection getCon() {
return con;
}
private static String ROWS = "\"uuid\", ...";
private String insertMyModelQuery() {
return "INSERT INTO table_name (" + MyModelClient.ROWS + ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)" +
"ON CONFLICT(\"uuid\") DO UPDATE SET url=EXCLUDED.url RETURNING uuid;";
}
public void insertMyModel(MyModel article) {
try (PreparedStatement preparedStatement = con.prepareStatement(this.insertMyModelQuery())) {
preparedStatement.setObject(1, article.uuid);
...
preparedStatement.executeUpdate();
} catch (SQLException e) {
throw new InsertMyModelException("failed to insert MyModel: " + e.toString(), e);
}
}
}
public class MyModelClientTest {
static MyModelClient client;
@BeforeAll
public static void setUp() {
client = new ArticleClient("jdbc:h2:mem:testdb;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE", "postgres", "mysecretpassword");
String sql = "-- template"+
"CREATE TABLE my_model_template ("+
" uuid UUID NOT NULL,"+
... +
");";
String sql2 = "-- Create table"+
"CREATE TABLE table_name"+
" (LIKE my_model_template)"+
" PARTITION BY RANGE (created_datetime);";
try {
Statement s=client.getCon().createStatement();
s.execute(sql);
s.execute(sql2);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Test
public void shouldInsertMyModel() {
System.out.println("TEST---------------------");
MyModel m = TestMyModelBuilder.build();
client.insertMyModel(m);
}
}
failed to insert MyModel: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "table_name" not found;
测试目录中的Application.Properties如下所示:
spring.datasource.url=jdbc:h2:mem:testdb;DATABASE_TO_UPPER=false;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=postgres
spring.datasource.password=mysecretpassword
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.defer-datasource-initialization=true
当您在application.properties文件中使用错误的方言,或者针对错误的数据库进行验证时,就会发生这种情况。例如,当您针对本地H2数据库运行应用程序时,最好的选择是删除方言,因为Hibernate可以在没有此属性的情况下识别数据库(如果Hibernate的版本足够新,可以识别较新的数据库)。另一个解决方案是删除validate属性,但我不建议这样做,因为在启动时没有数据库检查:
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
问题内容: 我有一个带有URL的H2数据库。我使用创建表格;。然后,我使用从(空)表中选择所有内容。到目前为止,一切都很好。 但是,如果将URL更改为,唯一的区别是数据库现在仅在内存中,这给了我一个提示。我可能在这里缺少一些简单的东西,但是任何帮助将不胜感激。 问题答案: hbm2ddl在创建表后关闭连接,因此h2放弃该连接。 如果你的连接网址是这样配置的 在最后一个连接关闭时,数据库的内容会丢失
我将Spring boot JPA实体定义为: 上述方法在DB2中效果良好,但在H2中效果不佳。 在application.properties,我有以下设置: 当我做maven的时候 原因:org。h2。jdbc。JdbcSQLSyntaxErrorException:未找到架构“MYSCHEMA”;SQL语句:公共类CarEntity实现可序列化的{。。。 我希望在H2上创建模式,因为我在我的
我是Spring Data JPA的新手。我试图为存储库创建一个自定义方法,但是它确实抛出了一个异常。以下是我目前的实现: 这是我启动应用程序时发生的异常(我正在使用 Spring 启动)。
我使用h2数据库作为maven项目的依赖项: 要在内存模式下使用,我已经配置了应用程序。属性文件: 正如这里和这里所提到的,因为对于variant:
一、内存数据库: 在SQLite中,数据库通常是存储在磁盘文件中的。然而在有些情况下,我们可以让数据库始终驻留在内存中。最常用的一种方式是在调用sqlite3_open()的时候,数据库文件名参数传递":memory:",如: rc = sqlite3_open(":memory:", &db); 在调用完以上函数后,不会有任何磁盘文件被生成,取而代之的是,一个新的数据库在纯内存中被成功创建了。
我面临着使用Spring数据JPA存储库将数据保存到数据库的问题。 我的场景是:我使用循环逐个收集和保存数据。收集所有数据需要很多时间。因此,我想将每个记录的数据立即保存到表中并保存到数据库中。我正在使用saveAndFlush方法,但数据并没有立即保存到表中。 我迫不及待地要收集所有数据,因为收集所有数据可能需要一整天。