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

时间:2009-03-23 15:20:56

标签: hibernate import initialization data-importer

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

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

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

7 个答案:

答案 0 :(得分:81)

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

  

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

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

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

答案 1 :(得分:60)

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

仅当hbm2ddl.auto设置为createcreate-drop时,此功能才有效。

答案 2 :(得分:42)

在你的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>

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

,hibernate默认使用它。

答案 3 :(得分:20)

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

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

与上述elsewhere一样,使用hibernate.hbm2ddl.autohibernate.hbm2ddl.import_files进行数据库更改管理存在一些严重的缺点:

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

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

答案 4 :(得分:7)

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

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

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

希望有所帮助。

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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

您可以浏览Hibernate的AvailableSettings类中列出的与架构导出和测试数据导入相关的各种设置。