2009-10-26 41 views
2

在应用程序启动/关闭应用程序时,使用jpa创建表的最佳方式是什么? 喜欢,但与数据操纵语言,而不是数据定义语言。 我使用HibernatePersistence作为持久性提供者。启动时的JPA自定义脚本

回答

1

用默认包中的import.sql解决,并选择“create”作为hibernate.hbm2ddl.auto的值。 Hibernate也支持hibernate.hbm2ddl.import_files属性。

+0

听起来很有用,你有链接找到这些信息的文档吗? – 2013-05-23 16:19:46

+1

here:http://docs.jboss.org/hibernate/orm/3.6/reference/en-US/html/session-configuration.html CTRL-F“hibernate.hbm2ddl.import_files” – 2013-05-24 09:40:23

2

如果您也使用弹簧,那么this answer将工作。

如果您不使用Spring,那么您必须手动运行DDL代码。请注意,Hibernate只有有限的修改数据库的支持(它基本上只能创建表)。所以如果你需要其他东西,你必须使用自定义SQL。

[编辑]如果你不使用Spring,那么你会找到一种方法来获得休眠Session。调用允许运行任意SQL的doWork()方法。

另一种方法是创建域对象并保留它们。不过,我更喜欢第一种方法,因为您可以通过这种方式修复生成的对象的ID,并使用JPA接口执行其他更复杂的操作。

您不想写很多insert语句,然后将数据插入到数据库中,并使用像SquirrelSQL这样的SQL工具导出数据,这可以为您创建insert语句。把它们放入一个额外的文件中,在启动时读取这个文件,将它拆分为;并执行每个文件。

+0

我相信OP是询问如何用数据填充表格,而不是改变数据库模式。 – ChssPly76 2009-10-26 16:29:39

+0

是的,我没有用这个项目的弹簧:) – 2009-10-27 09:18:44

+0

好吧,现在我正在使用外部的SQL文件,我在数据库创建后加载。 – 2009-10-28 16:25:20

0

我认为使用低级sql插入语句来填充表不是最好的选择,因为您应该手动处理外键并使用代码重构这些语句。

由于您已经有了对象模型和ORM,因此另一种更便于使用的解决方案是使用对象定义init数据,并让JPA提供程序持久化它们。虽然这个解决方案看起来很麻烦,但是使用像this这样的项目使得它更加合理。

0

出于测试目的,我采取了使用简单的groovy脚本和org.codehaus.groovy.maven的gmaven插件。 gmaven-plugin执行groovy脚本,脚本在generate-test-resources maven生命周期中创建import.sql。在脚本中使用循环和计数器要比手动输入填充了插入语句的文件好得多。这当然要求你对hbm2ddl的东西进行排序,因为看起来你已经从之前的更新和答案中找到了它。