部署应用程序时,我经常使用Hibernate的功能来创建数据库架构,以简化部署。通过配置hibernate.hbm2ddl.auto属性可以轻松实现。
但是,有时我还需要向数据库中插入一些初始数据,例如root用户。有什么办法可以通过休眠并加载某种文本文件来实现?
我知道我可以轻松地编写将要执行此操作的代码,但是只是想知道是否已经有一些实用程序可以帮助我通过配置实现相同的功能?
Answers:
我通过搜索“休眠装置”发现了这一点:
Hibernate将在创建实体管理器工厂时创建数据库(实际上是在实体管理器工厂创建Hibernate的SessionFactory时)。如果在类路径的根目录('/import.sql')中存在一个名为import.sql的文件,则Hibernate将在创建数据库模式后执行从该文件读取的SQL语句。重要的是要记住,在Hibernate创建模式之前,它会清空它(删除所有表,约束或在构建模式的过程中将要创建的任何其他数据库对象)。
资料来源:http : //www.velocityreviews.com/forums/t667849-hibernate-quotfixturesquot-or-database-population.html
试试看,让我们知道它是否有效!
将import.sql添加到类路径非常有效,hbm2ddl检查文件是否存在并执行。唯一的附加细节是每个sql命令必须位于其自己的行上,否则它将无法执行。
仅当hbm2ddl.auto
设置为create
或时,它也将起作用create-drop
。
<property name="hibernate.hbm2ddl.import_files_sql_extractor">org.hibernate.tool.hbm2ddl.MultipleLinesSqlCommandExtractor</property>
你hibernate.cfg.xml
(stackoverflow.com/a/15090964)
在您的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使用此文件
hbm2ddl.auto
和hbm2ddl.import_files
属性是邪恶的就像在其他地方所说的那样,使用hibernate.hbm2ddl.auto
和hibernate.hbm2ddl.import_files
用于数据库变更管理有一些严重的缺点:
我个人使用liquibase进行数据库更改管理,并开发了以下工作流程以减少维护工作:
即使对于必须实施customChange的复杂更改,也可以在几个小时内完成,包括回滚的定义,测试和文档。对于微不足道的更改,只需几分钟即可完成。基本上:您需要做更多的工作(我在不到一天的时间内就为4个数据库配置创建了自定义的变更集),但是您可以放心地进行了所有可能的工作,以使数据库保持一致的状态。
hbm2ddl
对于大多数人来说,这是一个非常合适的工具。
经过几个小时的尝试,我决定分享我的发现,尽管这是一个非常古老的帖子。
为了使其正常工作,我必须执行以下操作:
hbmddl
设置为create
或create-drop
resources
文件夹中,我正在使用Maven。希望能有所帮助。