如何使用Hibernate将初始数据导入数据库?


68

部署应用程序时,我经常使用Hibernate的功能来创建数据库架构,以简化部署。通过配置hibernate.hbm2ddl.auto属性可以轻松实现。

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

我知道我可以轻松地编写将要执行此操作的代码,但是只是想知道是否已经有一些实用程序可以帮助我通过配置实现相同的功能?

Answers:


84

我通过搜索“休眠装置”发现了这一点:

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

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

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


5
从我所看到的,SQL似乎不是数据库不可知的
Dan

+!for import.sql应该在根目录中,而不仅仅是在任何地方
Eyad Ebrahim 2014年

63

将import.sql添加到类路径非常有效,hbm2ddl检查文件是否存在并执行。唯一的附加细节是每个sql命令必须位于其自己的行上,否则它将无法执行。

仅当hbm2ddl.auto设置为create或时,它也将起作用create-drop


21
仅当hbm2ddl.auto设置为“ create”或“ create-drop”时,它也有效。
2011年

1
这个评论对我很有帮助。
Marcin Cylke 2011年

2
将每个sql语句放在单独的行中的要求很奇怪。谢谢指点出来
塔希尔·阿赫塔尔

1
您可以通过添加启用多行SQL命令<property name="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</property>hibernate.cfg.xmlstackoverflow.com/a/15090964
cooljeffro

45

在您的hibernate配置中添加hibernate属性hibernate.hbm2ddl.import_files。更改hibernate.hbm2ddl.auto属性以创建。使用初始sql代码在/ classes目录中添加initial_data.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>

如果您不想在休眠配置中添加属性,则可以在/ classes目录中创建文件import.sql,并且如果属性hibernate.hbm2ddl.auto等于create,则默认情况下,hibernate使用此文件


22

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

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

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

  1. 只能更改结构。现有值可能会被覆盖,或者-在最坏的情况下-只是简单地发送到Nirvana中。没有liquibasescriptella之类的工具,您将没有任何ETL功能。
  2. 此方法没有交易。在事务管理器接管之前,将执行结构和数据语句。假设您在语句42的256中有一个错误。数据库现在处于不一致状态。
  3. Imvho,您失去了透明度和控制力:在scriptella脚本或liquibase更改集或通常与域模型中的更改一起提交的情况下,您对域模型进行了更改,并希望(基本上)希望休眠会发现要做什么。(不是,但这是一个不同的故事。)
  4. 对于集成,系统和验收测试,您仅假设测试数据库生产数据库处于绝对完全相同的状态。您必须手动跟踪它(祝您好运,并祝您玩得愉快!;))。万一您犯了一个错误,只需要很小的滑移就足够了,结果可能会给我们带来灾难性的后果。

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

  • 我上一个发布结构的命令行创建一个变更日志
  • 创建我的最新数据库的变更日志
  • 手动diff比较两个更改日志(通常更改不是那么大,如果更改很大,它们通常会遇到liquibases diff命令的缺点之一)。
  • 创建变更集

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


1
Liquibase非常棒,对于某种程度上已经解决并由团队开发的产品,这是一个绝妙的主意。另一方面,如果您是一个单独的开发人员,则可以构建原型,充实基础知识或以其他方式探索会大量流失的东西,能够在几秒钟内迅速使它工作,而不是几分钟或几小时就可以部署,这是非常有价值的。通常,一旦有了QA数据集之类的东西,或者肯定在您拥有生产数据时,应删除hbm2ddl.auto。愚蠢地说任何一种方式都是邪恶的。
Gus

@Gus “没有什么比临时的更具定义性了;;)而您似乎确实忽略了一些东西((当被误用作数据库变更管理的工具时)”这个问题清楚地表明,我们正在谈论部署,因此数据库变更管理是这里的上下文。我坚持我的说法:对于部署来说,两个都是彻头彻尾的邪恶。顺便说一句,即使是单个开发人员,liquibase也不是一件容易的事。从长远来看,它会更少。
Markus W Mahlberg

这是愚蠢的,非常无济于事。对于简单的自动化测试,hbm2ddl对于大多数人来说,这是一个非常合适的工具。
加文·金

那么,如何确保生产设置将迁移到开发设置?开火祈祷?
Markus W Mahlberg

您调用了一个有用的工具,我写道,数十年来,成千上万的人已经成功使用了“邪恶”工具。对于数据管理中的每个问题,这并不是万能的解决方案,但这并没有使它变得“邪恶”。
加文·金

8

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

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

  • hbmddl设置为createcreate-drop
  • classpath根目录中的file.sql; 就我而言,我只是将其放在resources文件夹中,我正在使用Maven。
  • 一行中的每个sql命令
  • 每个file.sql在文件开始处必须有一个空行==>不知道其原因,但是如果我不插入该空行,则在执行时服务器会告诉我第一个字符附近的语法错误。

希望能有所帮助。


4
“第一线问题”听起来像BOM
dtrunk

1
我认为您的意思是import.sql,而不是file.sql。
Koray Tugay

“ file.sql”是指任何* .sql文件,请记住名称,只要您在持久性文件中指定即可。import.sql是默认情况下导入的文件名(如果存在),而无需在持久性文件中指定。
2017年

0

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


0

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

您可以探索HibernateAvailableSettings类中列出的与架构导出和测试数据导入相关的各种设置。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.