2012-03-22 55 views
6

我有一个JPA项目,我想在开发时插入一些初始数据,这样我就可以检查一切是否顺利运行。如何使用Java JPA加载初始数据(或种子数据)?

我的研究让我发现只有直接SQL脚本的解决方案,但这是不对的。如果我使用框架来抽象数据库细节,为什么我会为特定数据库创建脚本?

在Ruby on Rails的世界中,我们使用命令“rake db:seed”,它简单地执行一个名为seed.rb的文件,该文件具有在调用抽象层的数据库上添加初始数据的功能。有没有像这样的Java?

我能想到的理想解决方案是执行一个执行java类的maven目标,有没有简单的方法或Maven插件来执行它?

回答

4

我觉得你的痛苦,我已经想要在一个Java项目中完成Rails所有的特权。

这就是说,没有理由使用直接的SQL。这种做法只是要求麻烦。随着数据库模式在开发过程中发生变化,所有易碎的SQL都会中断。如果将数据映射到JPA模型(这将抽象SQL与数据库的交互),则更容易管理数据。

你应该做的是使用你的JPA模型播种你的数据。创建一个组件,可以执行所需模型的创建并保存它们。在我目前的项目中,我们使用Snake YAML将我们的模型序列化为Yaml。为了种子我们的数据库,我们将yaml反序列化为JPA模型并坚持。

如果模型更改(变量类型更改,删除列等),您必须确保序列化数据仍然能够正确地反序列化到JPA模型中。使用Yaml的人类可读格式可以轻松更新序列化模型。

要真正运行你的种子数据,尽管你可以引导你的系统。正如@GeoorgeMcDowd所说,你可以使用一个Servlet。我个人更喜欢用Class.main创建一个uberjar来创建一个命令行工具。然后你只需要创建一个脚本来设置你的类路径,并调用Class.main来运行种子。

就我个人而言,我喜欢Maven作为项目元数据,但觉得它作为构建工具很困难。以下可用于exec的java类:

mvn exec:java -Dexec.mainClass="com.package.Main" 
+0

为什么你需要将你的模型序列化/反序列化到YAML? – 2012-04-13 16:57:22

+0

不一定需要是YAML,任何将模型序列化到文件的方式都可以。然后,您可以使用这些文件作为数据库的种子数据。 Yaml的优点是易于阅读和编辑。 – mguymon 2012-04-13 18:34:05

+0

为YAML理念+1 ...很好! – HDave 2013-02-14 22:29:42

2

只需创建一个类和方法来创建对象并保存数据。启动应用程序时,运行您在servlet init中创建的方法。您可以使用以下web.xml配置加载servlet。

<servlet> 
    <servlet-name>MyServlet1</servlet-name> 
    <servlet-class>com.example.MyServlet1</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

编辑:将web.xml格式化为更易读者。

+0

或者,您可以从Spring bean执行此操作,因此无需servlet容器即可完成集成测试。 – HDave 2013-02-14 22:29:24

1

您可以使用Maven为您的项目建模并编写一个简单的测试来初始化种子数据,因此您唯一需要做的就是运行“mvn test”。

0

类似amuniz的想法:看看dbunit。它是一个JUnit扩展,用于将测试数据植入数据库。它使用一个简单的无模式xml格式。并且使用“mvn test”通过测试课来运行它是一件简单的事情。

+0

我已经完成了这个工作,但是它的结果XML与OP首先试图避免的SQL一样脆弱。 – HDave 2013-02-14 22:28:53

+1

您可以通过在生产中加入数据库迁移工具(如liquibase)以及测试数据管理来减少一些脆性和手动返工。 – nansen 2013-02-15 10:54:07

-1

我建议liquibase http://www.liquibase.org/为此。它有许多插件,并允许您为每个更改集定义回滚逻辑(并在某些情况下检测回滚)。

在这种情况下,重要的是要考虑生产服务器以及种子数据如何转移到生产环境。

相关问题