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

如何使用JavaJPA加载初始数据(或种子数据)?,java,jakarta-ee,jpa,maven,Java,Jakarta Ee,Jpa,Maven,我有一个JPA项目,我想在开发过程中插入一些初始数据,这样我就可以检查是否一切都很顺利 我的研究使我找到了使用DirectSQL脚本的唯一解决方案,但这是不对的。如果我使用框架来抽象数据库细节,为什么要为特定数据库创建脚本 在RubyonRails世界中,我们有一个命令“rakedb:seed”,它简单地执行一个名为seed.rb的文件,该文件具有在调用抽象层的数据库上添加初始数据的功能。java上有类似的东西吗 我能想到的理想解决方案是执行一个maven目标,该目标将执行一个java类,是否有

我有一个JPA项目,我想在开发过程中插入一些初始数据,这样我就可以检查是否一切都很顺利

我的研究使我找到了使用DirectSQL脚本的唯一解决方案,但这是不对的。如果我使用框架来抽象数据库细节,为什么要为特定数据库创建脚本

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


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

只需创建一个类和方法来创建对象并持久化数据。启动应用程序时,运行在servlet init中创建的方法

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

MyServlet1
com.example.MyServlet1
1.

编辑:对web.xml进行格式化,使其更易于阅读。

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

我感觉到了您的痛苦,我一直希望在Java项目中获得Rails的所有好处

也就是说,没有理由使用直接SQL。这种做法只会自找麻烦。随着数据库模式在开发过程中的更改,所有脆弱的SQL语句都会中断。如果将数据映射到JPA模型,则更容易管理数据,这将抽象与数据库的SQL交互

您应该做的是使用您的JPA模型为您的数据播种。创建一个组件,该组件可以执行所需模型的创建并将其持久化。在我当前的项目中,我们使用将模型序列化为Yaml。为了给数据库添加种子,我们将yaml反序列化为JPA模型并持久化

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

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

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

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

与阿穆尼兹的想法类似:看一看。它是一个JUnit扩展,用于将测试数据转换成数据库。为此,它使用了一种简单的无模式xml格式。使用“mvn测试”在测试类中运行它是一件简单的事情。

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


在这种情况下,还必须考虑生产服务器以及种子数据将如何移动到生产中

为什么需要将模型序列化/反序列化为YAML?不一定需要是YAML,任何将模型序列化为文件的方法都可以。然后可以将这些文件用作数据库的种子数据。Yaml的优点是易于阅读和编辑。我已经这样做了,虽然它可以工作,但生成的XML与OP最初试图避免的SQL一样脆弱。您可以通过包括db迁移工具(如liquibase)来减少一些脆弱性和手动返工,或者,您可以从Springbean执行此操作,因此无需使用servlet容器进行集成测试。