【问题标题】:How to add Fixtures to Spring Hibernate project如何将 Fixtures 添加到 Spring Hibernate 项目
【发布时间】:2011-03-13 12:37:35
【问题描述】:

我正在尝试将固定装置/示例数据添加到使用 Hibernate 作为 JPA 的 Spring 项目中。

我创建了一个 fixtures.sql 文件(在 WEB-INF/classes/fixtures.sql 中),其中包含我想在开发时执行这些 SQL 查询以用示例数据填充数据库。 在开发模式下,我使用内存数据库 Hypersonic InMemory,当我部署到 Postgres 或 MySQL 时,将加载相同的数据。

当应用程序重新启动/启动时如何加载这些数据?每次应用程序重新启动时,Hypersonic 都会擦除内存中的数据库,这意味着每次我想在前端测试某些东西时,我都需要完成所有步骤来创建示例数据。

database.properties:

database.password=
database.url=jdbc\:hsqldb\:mem\:myproject
database.username=sa
database.driverClassName=org.hsqldb.jdbcDriver

persistence.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
            <!-- value="create" to build a new database on each run; value="update" to modify an existing database; value="create-drop" means the same as "create" but also drops tables when Hibernate closes; value="validate" makes no changes to the database -->
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
            <property name="hibernate.connection.charSet" value="UTF-8"/> 
        </properties>
    </persistence-unit>
</persistence>

【问题讨论】:

    标签: hibernate spring


    【解决方案1】:

    你可以使用&lt;jdbc:initialize-database&gt;,见12.9 Initializing a DataSource

    【讨论】:

    • 这是 Spring Security 建议加载角色和权限的方式,但今天早些时候无法让它工作。感谢您的链接:-)
    【解决方案2】:

    三种可能的方式:

    1. 使用 import.sql(参见“创建”部分中的http://blog.eyallupu.com/2007/05/hibernates-hbm2ddl-tool.html

    2. 使用 DBUnit(参见 http://onjava.com/pub/a/onjava/2004/01/21/dbunit.html

    3. 通过创建域对象并保存它们,编写代码以在 @SetUp(或应用启动)时填充数据库。

    【讨论】:

    • 经过一些调整,我得到了 import.sql 的工作,感谢一百万!必须在我的 persistence.xml 中添加额外的一行以使其工作:
    • 出于好奇,最初的数据叫什么?在 Pylons 框架(一个 python 框架)中工作时,它被称为夹具,Spring / Hibernate 是否使用相同的术语?
    • 我不认为 Spring / Hibernate 称它为与夹具不同的东西。这是这类事情的常用术语。或者更确切地说,这些数据是测试夹具的一部分。
    【解决方案3】:

    如果您喜欢更结构化的方法并且您的项目足够大,您应该看看https://github.com/42BV/jarb 和,或http://www.liquibase.org/。 您还应该考虑是否需要瞬态的新固定装置或持久固定装置(请参阅 xUnit 测试模式)。对于 spring,这种设置可以与环境抽象和 bean 配置文件一起使用(参见 3.1 中的@Profile)

    【讨论】:

    • liquibase 的超级粉丝,有没有很好的方法将它与 Hibernate 项目集成?
    • 如果您有一个 java 配置的 spring 项目,JaRB 将非常适合:@Bean public PopulateApplicationListener populateAppliationListener() { return new PopulateApplicationListenerBuilder().initializer().add(new SqlDatabasePopulator(dataSource, new ClassPathResource("import.sql"))).build();} 我们还支持异步加载数据/数据库特定脚本/或目录中的一组文件。跨度>
    猜你喜欢
    • 2023-04-09
    • 2012-06-12
    • 2021-04-10
    • 2017-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-09-26
    • 2015-09-28
    • 2021-04-01
    相关资源
    最近更新 更多