2

我想创建一个使用 JPA 作为其持久性抽象的模块化(类似插件)应用程序,并且该应用程序应该可以由第三方扩展。

问题是我希望这个应用程序及其插件能够轻松移植到其他数据库/JPA 提供程序,因此第三方供应商对使用的 JPA 提供程序(或数据库连接)一无所知,他们只能扩展持久层通过定义要存储在主应用程序持久性单元中的新实体(这将允许切换数据库而无需重新配置每个模块以指向新数据库)。

我可以用 JPA 做类似的事情吗?我可以使用 .NET 的 nHibernate(也可能使用 Hibernate)轻松完成,但我更喜欢针对 JPA 进行编程,因为我在 Java EE 环境中。

4

2 回答 2

1

有趣的是,我正是使用 OSGi、Equinox 和 EclipseLink 实现的,但这并非易事。本质上,自定义包从所有已解析的包中获取所有 persistence.xml 文件,将它们合并为一个用于初始化 EclipseLink Persistence Provider 的 persistence.xml。此外,还有一些自定义钩子允许我为开发和部署分别指定 fe 连接选项。

缺点:告别容器管理的持久化,但仍然可以加入事务。此外,一些工具对跨捆绑实体引用反应剧烈。此外,如果您添加包含新实体的新捆绑包,则需要事先使用适当的表、引用、索引和约束设置数据库。

优点:放入新的捆绑包,立即看到它动态地工作,而无需重新启动容器。

于 2010-07-23T13:51:07.570 回答
0

我还在研究如何以模块化方式(在 Netbeans 模块系统或 OSGI 容器中)进行 JPA。

您应该注意的一件事是,如果您需要构建一个中央的大型 EntityManagerFactory(通过中央持久性模块),那么如果您的应用程序很大,您可能会遇到一些问题:

  • 如果持久性模块需要对模块启动/关闭事件做出反应,则需要在添加或删除模块时重建中央 EntityManagerFactory。如果应用程序很大(很多类),重建 EntityManagerFactory 会很慢而且成本很高。

  • 应用程序不需要存储对 EntityManagerFactory 的引用,因为如果添加/删除了一个模块,旧的模块就会变得陈旧。应用程序应该使用非常短暂的 EntityManager 并始终获得 EntityManagerFactory。

为每个使用 JPA 的模块构建 EntityManagerFactories 可能更灵活,但这可能需要更多内存并且可能占用更多计算能力,直到为每个模块创建所有 EntityManagerFactories(尽管 EntityManager 工厂可能由您的按需创建中央 JPA 服务)。

如果您在 OSGI 容器中工作,Dynamic-JPA (http://www.dynamicjava.org/projects/dynamic-jpa) 可能会有所帮助。

于 2011-01-04T11:21:49.607 回答