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

Dan*_*Dan 63 import hibernate initialization data-importer

在部署应用程序时,我经常使用Hibernate的容量来创建数据库模式,以简化部署.通过配置hibernate.hbm2ddl.auto属性可以轻松实现这一点.

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

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

Mat*_*ger 83

我通过搜索"Hibernate灯具"找到了这个:

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

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

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

  • 从我所看到的,sql似乎不是db-agnostic (5认同)

小智 61

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

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

  • 仅当hbm2ddl.auto设置为"create"或"create-drop"时,它才有效. (21认同)
  • 您可以通过将“<property name="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</property>”添加到“hibernate.cfg.xml”(https:// /stackoverflow.com/a/15090964) (3认同)
  • 将每个sql语句放在单独的行中的要求很奇怪。感谢您指出 (2认同)

小智 44

在你的hibernate配置中添加hibernate属性hibernate.hbm2ddl.import_files.将hibernate.hbm2ddl.auto属性更改为create.使用初始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>
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*erg 22

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

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

其他地方一样,使用hibernate.hbm2ddl.autohibernate.hbm2ddl.import_files进行数据库更改管理有一些严重的缺点:

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

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

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

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

  • Liquibase 非常棒,对于一个已经稳定下来并由团队开发的产品来说,这是一个很棒的主意。另一方面,如果您是一名独立开发人员,正在构建原型、充实基础知识或以其他方式探索会产生大量干扰的内容,那么能够在几秒钟内(而不是部署时的几分钟或几小时)快速使其工作是非常有价值的。通常,一旦有了 QA 数据集,或者当然有了生产数据,就应该删除 hbm2ddl.auto。愚蠢地说任何一种方式都是邪恶的。 (2认同)

jom*_*mar 7

经过几个小时的绊脚石,我决定分享我发现的东西,虽然这是一个非常古老的帖子.

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

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

希望有所帮助.

  • "第一线问题"听起来像BOM (4认同)