DBUnit 有没有办法自动创建表?
Posted
技术标签:
【中文标题】DBUnit 有没有办法自动创建表?【英文标题】:Is there any way for DBUnit to automatically create tables? 【发布时间】:2010-12-04 14:49:20 【问题描述】:我刚刚意识到 DBUnit 不会自己创建表(请参阅 How do I test with DBUnit with plain JDBC and HSQLDB without facing a NoSuchTableException?)。
DBUnit 有没有办法自动从数据集或 dtd 创建表?
编辑:对于像 HSQLDB 这样的内存数据库的简单测试,可以使用一种粗略的方法来自动创建表:
private void createHsqldbTables(IDataSet dataSet, Connection connection) throws DataSetException, SQLException
String[] tableNames = dataSet.getTableNames();
String sql = "";
for (String tableName : tableNames)
ITable table = dataSet.getTable(tableName);
ITableMetaData metadata = table.getTableMetaData();
Column[] columns = metadata.getColumns();
sql += "create table " + tableName + "( ";
boolean first = true;
for (Column column : columns)
if (!first)
sql += ", ";
String columnName = column.getColumnName();
String type = resolveType((String) table.getValue(0, columnName));
sql += columnName + " " + type;
if (first)
sql += " primary key";
first = false;
sql += "); ";
PreparedStatement pp = connection.prepareStatement(sql);
pp.executeUpdate();
private String resolveType(String str)
try
if (new Double(str).toString().equals(str))
return "double";
if (new Integer(str).toString().equals(str))
return "int";
catch (Exception e)
return "varchar";
【问题讨论】:
【参考方案1】:不是真的。正如您链接的答案所指出的那样,dbunit xml 文件包含数据,但不包含列类型。
而且您真的不想这样做;您可能会冒着测试工件污染数据库的风险,从而增加生产代码意外依赖测试过程创建的表的可能性。 p>
需要这样做强烈表明您没有充分定义和编写数据库创建和维护过程。
【讨论】:
【参考方案2】:没有。您必须执行一个包含表定义的 SQL 脚本。
正如我在另一个线程中发布的那样,XML 不包含足够的数据来创建表。我想你可以做一些可怕的事情,比如解析值来试图找出它包含的值,但这会很脆弱。这与 Hibernate 的不同之处在于带注释的类确实包含很多关于数据库外观的信息。部分在注解和部分在 Java 类型字段中。
http://www.dbunit.org/faq.html#ddl
【讨论】:
【参考方案3】:Spring Boot/Spring JDBC 可以使用普通 JDBC 初始化数据库。
Spring JDBC 有一个 DataSource 初始化器特性。 Spring Boot 启用 默认情况下,它会从标准位置
schema.sql
加载 SQL 和data.sql
(在类路径的根目录中)。此外,Spring Boot 将 加载schema-$platform.sql
和data-$platform.sql
文件(如果 present),其中平台是spring.datasource.platform
的值, 例如您可以选择将其设置为数据库的供应商名称 (hsqldb、h2、oracle、mysql、postgresql 等)。
https://docs.spring.io/spring-boot/docs/current/reference/html/howto-database-initialization.html
【讨论】:
【参考方案4】:如果您使用 JPA,您通常可以配置您的 JPA 提供程序,以便它在初始化时创建/更新表。
例如对于休眠,指定属性 hibernate.hbm2ddl.auto 并将其值设置为 create-drop(应该可以用于测试)。
另请参阅:Hibernate Documentation, Chapter 3 Configuration
但是,请确保 JPA 提供程序是第一个访问数据库的 ;)
【讨论】:
【参考方案5】:我只是想插话说这对我很有帮助。我需要连接到 Oracle 数据库并将其导出到 XML 文件,然后将其作为测试 HSQL 数据库导入并使用 Hibernate 访问它。我在做之前使用此代码创建表
DatabaseOperation.CLEAN_INSERT.execute(conn, dataset);.
但请注意,此代码将每个表的第一列设置为主键,因此如果您使用关系表,请小心,因为您可能会在导入时遇到“主键约束违规”。感谢代码 sn-p!
【讨论】:
这不会创建任何表,代码只是从提供的数据集中插入数据。以上是关于DBUnit 有没有办法自动创建表?的主要内容,如果未能解决你的问题,请参考以下文章