70

在部署应用程序时,我经常使用 Hibernate 的能力来创建数据库模式,以简化部署。这很容易通过配置 hibernate.hbm2ddl.auto 属性来实现。

但是,有时我还需要向数据库中插入一些初始数据,例如 root 用户。有没有办法通过休眠和某种加载文本文件来实现这一点?

我知道我可以很容易地编写代码来实现这一点,但只是想知道是否已经有一些实用程序可以帮助我通过配置实现相同的目标?

4

7 回答 7

85

我通过搜索“休眠装置”找到了这个:

Hibernate 会在创建实体管理器工厂时创建数据库(实际上是在实体管理器工厂创建 Hibernate 的 SessionFactory 时)。如果类路径('/import.sql')的根目录中存在一个名为 import.sql 的文件,Hibernate 将在创建数据库模式后执行从该文件中读取的 SQL 语句。重要的是要记住,在 Hibernate 创建模式之前,它会清空它(删除所有表、约束或将在构建模式的过程中创建的任何其他数据库对象)。

资料来源:http ://www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html

试一试,让我们知道它是否有效!

于 2009-03-23T23:42:17.617 回答
64

将 import.sql 添加到类路径效果很好,hbm2ddl 检查文件是否存在并执行它。唯一的额外细节是每个sql命令必须在自己的行中,否则将无法执行。

这也仅在hbm2ddl.auto设置为createor时才有效create-drop

于 2009-05-29T21:48:05.420 回答
46

在您的休眠配置中添加休眠属性hibernate.hbm2ddl.import_files 。更改 hibernate.hbm2ddl.auto 属性以创建。在 /classes 目录中添加 initial_data.sql 并使用初始 sql 代码插入数据。Hibernate 在创建数据库模式后执行此操作。

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">${hibernate.dialect}</prop>
            <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
            <prop key="hibernate.hbm2ddl.auto">create</prop>
            <prop key="hibernate.hbm2ddl.import_files">initial_data.sql</prop>
        </props>
    </property>
</bean>

如果您不想在 hibernate 配置中添加属性,您可以在 /classes 目录中创建一个文件 import.sql,如果属性 hibernate.hbm2ddl.auto 等于 create,hibernate 默认使用此文件

于 2013-07-08T13:19:03.053 回答
22

为什么hbm2ddl.autohbm2ddl.import_files属性是邪恶的

(当被误用作数据库变更管理工具时)

就像其他地方说的那样,使用hibernate.hbm2ddl.autoandhibernate.hbm2ddl.import_files进行数据库变更管理有一些严重的缺点:

  1. 只有结构可以改变。现有值可能会被覆盖,或者 - 在最坏的情况下 - 只是发送到 Nirvana。如果没有像liquibasescriptella这样的工具,您就没有任何ETL功能。
  2. 此方法没有事务。结构和数据语句都将在事务管理器接管之前执行。假设您在 256 的第 42 条语句中有错误。您的数据库现在处于不一致的状态。
  3. 恕我直言,您失去了透明度和控制权:在脚本或 liquibase 更改设置或通常与域模型中的更改一起提交的情况下,您在域模型中进行更改并希望(基本上)hibernate 会找出要做什么。(它没有,但这是一个不同的故事。)
  4. 对于集成、系统和验收测试,您只需假设您的测试数据库与生产数据库处于绝对、完全相同的状态。你必须手动跟踪它(祝你好运,玩得开心!;))。万一你犯了一个错误,一个小小的失误就足够了,结果可能我们将是灾难性的。

我个人使用 liquibase 进行数据库变更管理,并开发了以下工作流程来减少维护工作:

即使对于必须实现customChange的复杂更改,这也可以在几个小时内完成,包括回滚的定义、测试和文档。对于微不足道的更改,只需几分钟。基本上:您必须做更多的工作(我在不到一天的时间内为 4 个数据库配置创建了自定义更改集),但您可以放心,您已尽一切可能使数据库保持一致状态。

于 2014-03-22T01:55:13.357 回答
9

经过几个小时的磕磕绊绊,我决定分享我的发现,尽管这是一个非常古老的帖子。

为了使其正常工作,我必须执行以下操作:

  • hbmddl设置为createcreate-drop
  • 类路径根目录中的 file.sql;就我而言,我只是把它放在resources文件夹中,我使用的是 maven。
  • 一行中的每个 sql 命令
  • 每个 file.sql 必须在文件开头有一个空行==> 不知道这个的原因,但是如果我不插入那个空行,在执行时服务器告诉我有一个第一个字符附近的语法错误。

希望有帮助。

于 2015-09-03T18:40:50.240 回答
0

在 JPA 中执行此操作的标准方法是使用配置属性javax.persistence.sql-load-script-source

AvailableSettings您可以探索与 Hibernate类中列出的模式导出和测试数据导入相关的各种设置。

于 2020-07-31T16:24:05.913 回答
-1

请确保您的 import.sql 格式正确。从一个单行插入语句开始进行测试。

于 2018-09-21T09:51:32.633 回答