在我的 spring 项目中,我将 hibernate 配置为根据我的实体类在数据库中创建表。另外,当我需要在此表上插入一些初始值时,我将一个名为 import.sql 的文件放在类路径上,并使用 sql 命令在数据库中插入数据。我想知道是否有一种方法可以完成此导入功能,而无需在我的项目中放置 import.sql 文件,仅使用 java 类。有人知道这是否可能吗?
最佳答案
您可以考虑两种选择,
第一个不仅仅是java,但由于您正在使用该堆栈,因此您可以考虑 Spring DBUnit
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"/context.xml"})
@TestExecutionListeners({DependencyInjectionTestExecutionListener.class,
DirtiesContextTestExecutionListener.class,
TransactionalTestExecutionListener.class,
DbUnitTestExecutionListener.class})
@DbUnitConfiguration(dataSetLoader = ColumnSensingFlatXMLDataSetLoader.class)
public class TemplateIT {
@Before
public void after() throws Exception {
IDatabaseConnection connection;
IDatabaseTester databaseTester = new JdbcDatabaseTester(JDBC_DRIVER, JDBC_URL + "&sessionVariables=FOREIGN_KEY_CHECKS=0", USER, JDBC_PASSWORD);
connection = databaseTester.getConnection();
QueryDataSet partialDataSet = new QueryDataSet(connection);
DatabaseOperation.DELETE_ALL.execute(connection,
partialDataSet);
}
@DatabaseSetup("../dbunit/data.xml")
@ExpectedDatabase("../dbunit/expected.xml")
@Test
public void testDBUnit() throws Exception {
...
}
}
数据是通过 XML 处理的,但由于该库专注于测试,因此它提供的许多实用程序比直接处理 SQL 更胜一筹。由于@ExpectedDatabase等,更容易处理部分数据,简化断言。
其次,我经常使用的一种“仅限 java”设置是通过 hibernate 实体准备数据。我假设您正在使用通用 DAO,即使没有,设置它也很容易。比在测试的 @Before 方法中简单地设置您喜欢的数据库,一个片段
@Before
public void before() throws DAOException {
Company company = new Company();
companyDAO.makePersistent(company);
}
我喜欢这种方法,因为我认为可以提高可移植性(我经常在内存数据库中使用进行测试)、可读性和可维护性。缺点是测试中需要大量代码,并且对于复杂对象来说准备数据可能会变得乏味。
关于java - 替换 spring/hibernate 项目中的 import.sql 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26568123/