在我的春季项目中,我已将hibernate配置为根据实体类在数据库中创建表。另外,当我需要在此表上插入一些初始值时,我使用sql命令在类路径上放置了一个名为import.sql的文件,以在数据库中插入数据。我想知道是否有一种无需使用我的java类就可以在我的项目中放置import.sql文件的情况下完成此导入功能的方法。有人知道这是否可能吗?

最佳答案

您可以考虑两种选择,

第一个不仅是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”设置是通过休眠实体准备数据。我假设您使用的是通用DAO,即使没有使用,也很容易设置。比起@Before测试方法,只需按照自己的喜好设置数据库即可

@Before
public void before() throws DAOException {
   Company company = new Company();
    companyDAO.makePersistent(company);
}


我赞成这种方法,因为我认为它提高了可移植性(通常在内存DB中用于测试),可读性和可维护性。缺点是测试中有很多代码,准备数据对于复杂对象可能会很乏味。

关于java - 在spring/hibernate项目中替换import.sql文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26568123/

10-12 14:53
查看更多