在我的spring项目中,我已经配置了hibernate来根据我的实体类在数据库中创建表。另外,当我需要在这个表上插入一些初始值时,我在我的类路径上放了一个名为import.sql的文件,用sql命令在数据库中插入数据。我想知道是否有办法完成这个导入功能,而不需要在我的项目中放置一个import.sql文件,只使用java类。有谁知道这是否可能?
答案 0 :(得分:1)
你可以考虑两种选择,
第一个不仅仅是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);
}
我赞成这种方法,因为在我看来增加了可移植性(通常我在内存DB中用于测试),可读性和维护。缺点是测试中有很多代码,准备数据对于复杂对象来说可能会很繁琐。