如何使用Java JPA加载初始数据(或种子数据)?

时间:2012-03-22 17:26:48

标签: java java-ee jpa maven

我有一个JPA项目,我想在开发时插入一些初始数据,所以我可以检查一切是否顺利运行。

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

在ruby on rails世界中,我们有命令“rake db:seed”,它简单地执行一个名为seed.rb的文件,该文件具有在调用抽象层的数据库上添加初始数据的功能。在java上有类似的东西吗?

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

5 个答案:

答案 0 :(得分:4)

我感到很痛苦,我在Java项目中想要了解Rails的所有优惠。

话虽如此,没有理由使用直接SQL。这种做法只是在惹麻烦。随着数据库架构在开发期间发生变化,所有脆弱的SQL都会中断。如果数据映射到JPA模型,则更容易管理数据,这将抽象SQL与数据库的交互。

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

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

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

就个人而言,我喜欢Maven作为项目元数据,但发现它很难作为构建工具。以下内容可用于执行java类:

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

答案 1 :(得分: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以使读者更友好。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

与amuniz的想法类似:看看dbunit。它是一个JUnit扩展,用于将测试数据化为数据库。它使用一种简单的无模式xml格式。使用“mvn test”在测试类中运行它是一件很简单的事情。

答案 4 :(得分:-1)

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

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