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

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

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

我知道我可以很容易地编写这样做的代码,但只是想知道是否已经有一些实用工具可以帮助我通过configuration实现相同的function?

我通过search“Hibernate fixture”find了这个:

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

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

试一试,让我们知道如果它的作品!

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

只有当hbm2ddl.auto设置为createcreate-drop这也将起作用。

在你的hibernateconfiguration中添加hibernate.hbm2ddl.import_files属性。 更改hibernate.hbm2ddl.auto属性来创build。 在/ classes目录中添加initial_data.sql和最初的sql代码以插入数据。 Hibernate在创build数据库模式之后执行此操作。

 <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> 

如果你不想在你的hibernateconfiguration中添加一个属性,你可以在/ classes目录下创build一个文件import.sql,如果属性hibernate.hbm2ddl.auto等于创build,hibernate默认使用这个属性

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

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

就像其他地方所说的那样,使用hibernate.hbm2ddl.autohibernate.hbm2ddl.import_files进行数据库更改pipe理有一些严重的缺陷:

  1. 只有结构可以改变。 现有的值可能被覆盖,或者在最坏的情况下被简单地发送到涅</s>。 没有像liquibase或scriptella这样的工具,就没有任何ETLfunction。
  2. 这种方法没有交易。 结构和数据语句都将在事务pipe理器接pipe之前执行。 假设您在第256条语句中有错误,您的数据库现在处于不一致的状态。
  3. Imvho,你放松透明度和控制:在一个scriptella脚本或liquibase更改设置或通常与域模型中的更改一起承诺,您在域模型中进行更改,并希望(基本上)hibernate将找出该怎么做。 (它不,但是这是一个不同的故事。)
  4. 对于集成,系统和验收testing,您只需假设您的testing数据库处于与生产数据库完全相同的状态 。 你必须手动跟踪(祝你好运,玩得开心!))。 如果你犯了一个错误,只是一个小小的失误就足够了,结果可能会非常惨重。

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

  • 从我上一个版本结构的命令行创build一个更新日志
  • 创build我的最新数据库的更新日志
  • 手动比较两个变更日志(通常变化不是那么大,如果是的话,他们通常会遇到liquibase diff命令的一个缺点。
  • 创build一个更改集

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

经过几个小时的磕磕绊绊之后,我决定分享我发现的东西,尽pipe这是一个很老的post。

为了使它正常工作,我必须做到以下几点:

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

希望有所帮助。