【问题标题】:Share a JPA datasource among osgi bundles在 osgi 包之间共享 JPA 数据源
【发布时间】:2017-06-01 19:00:18
【问题描述】:

我有这种情况:

  • 一个 SQL 数据库实例
  • 两个或多个带有 jpa 实体的 osgi 包和“他们的”实体的 spring-data 存储库
  • “jpa 包”之一是“核心包”,其他依赖于它(插件包)

我可以将它与单个数据源一起使用吗?

例子:

  • “核心包”包含Person实体
  • “Person 列表插件包”包含一个 PersonList 实体,它通过 people 属性引用 Person 实体

我现在想使用“人员列表插件包”中的PersonListService,它使用PersonListRepository.findByPeoplesFirstName(String firstName)

背景是我希望我的应用程序的数据库可以通过添加一个 osgi 包作为插件来扩展。

现在我尝试使用 apache karaf 和 hibernate 5,因为空间支持很重要。

【问题讨论】:

  • 为什么还要使用“插件”?例如,如果你有一个 Person 实体,那么所有处理 Person 的存储库类都应该在同一个包中。我认为将实体及其存储库分开是没有意义的。
  • 我想替换一个遗留应用程序,用户可以通过添加一个带有 php 代码的文件夹来安装一个“插件”,现在有一个“缓存生成器插件”,它添加了一些预先计算的表数据库。这需要访问自己的表和“核心”表。

标签: hibernate jpa osgi spring-data-jpa apache-karaf


【解决方案1】:

在 OSGi 中,建议 JPA EntityManager 的所有实体都驻留在同一个包中。您可以从查看所有实体的包中创建 EntityManager,但这不适用于您想要的插件模型。

无论如何,在生成多个捆绑包的数据库端创建模型可能会产生不必要的耦合。您应该研究有界上下文的 DDD 概念并创建持久性上下文以实现每个有界上下文。

无论如何,插件模型与数据库不太兼容,因为数据库通常需要具有完全静态的结构,而插件可能会在运行时来来去去。

您当然可以共享 DataSource,但这是在 jdbc 级别而不是 jpa 级别。

【讨论】:

  • 我害怕这个答案,但这些想法会奏效吗:每个“jpa-bundle”都会导入它需要的那些并创建自己的持久性上下文?我不能将对象从一个包共享到另一个包,但仍然使用实体和服务定义?
  • 我认为这行不通。原因是 EntityManager 会有不同的缓存,但会有效地写入同一个数据库。您当然可以共享一些基类,但每个 EntityManager 应该写入不同的表。
猜你喜欢
  • 2012-08-18
  • 2010-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-05-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-02
  • 2011-01-13
相关资源
最近更新 更多