【问题标题】:What is the best way to initialize data by JPA?JPA 初始化数据的最佳方式是什么?
【发布时间】:2014-03-04 07:08:57
【问题描述】:

是否有人通过将一些代码放入某个初始化类的静态构造函数或类似的东西来初始化数据?我想知道这样的可能性在哪里:

@EJB //some bean
public someDataClassOrFacade {
  static {
    if(DataFacade.checkIfThereIsNoExampleData()) {
     SomeDataClass sdc = new SomeDataClass();
     // (...) set data
     DataFacade.create(sdc);
    }
   }
} 

您如何看待这种初始化数据的方式?我不相信将 SQL 查询与 maven SQL 插件一起使用,因为它的灵活性较低(假设数据结构可以更改,尤其是列名)。但是,我不太确定什么时候会加载类。但这只是我的理论实践,也许你使用的东西比那好得多?谢谢。

【问题讨论】:

  • SomeDataClass' 构造函数是我放置此类代码的地方。
  • 好的,但是我必须在哪里调用构造函数?我的意思是,在我的业务逻辑之前我需要在哪里触发这个类来初始化?

标签: java maven jpa


【解决方案1】:

在我看来,您希望尽可能晚地在受控时刻初始化数据,因此静态初始化器对我来说是禁忌。这取决于我将在哪里进行初始化的应用程序类型。如果有一个 web 层,我可能会使用特定于 web 框架的初始化方法或使用 servlet 上下文侦听器。如果只有一个 EJB 层,我可能会在使用 @Startup 注释的单例 EJB 中执行此操作,因为我快速搜索过的这个线程显示:

EJB stateless - Private members initialisation

【讨论】:

  • 如果不想绑定到应用容器上,也可以在容器外使用JPA。因此,可以从命令行运行直接的 Java 类,而无需将其绑定到期望数据的应用程序。
  • 我会尝试,你对使用带有@Startup 注释的单例是正确的,但在我将这个答案作为解决方案之前,我会检查一下。谢谢。
【解决方案2】:

我会使用像 Liquibase 这样的东西而不是 EJB。它专为数据库管理而设计。

【讨论】:

  • 这不是问题所在。问题是如何结合 EJB 技术做到这一点。
  • 好吧,也许我想这样做,但不幸的是,使用过的技术不在讨论范围内。
猜你喜欢
  • 2019-08-03
  • 2010-09-17
  • 1970-01-01
  • 2012-01-28
  • 2012-02-08
  • 1970-01-01
  • 2019-07-24
  • 2017-11-01
  • 1970-01-01
相关资源
最近更新 更多