我想创建一个模块化(类似插件)的应用程序,它使用JPA作为持久性抽象,这个应用程序应该可以被第三方扩展。
问题在于我希望这个应用程序及其插件可以轻松移植到其他数据库/ JPA提供程序,因此第三方供应商无法了解所使用的JPA提供程序(或数据库连接),它们只能扩展持久层通过定义要存储在主应用程序持久性单元中的新实体(这将允许人们切换数据库而无需重新配置每个模块以指向新的数据库)。
我可以用JPA做类似的事吗?我可以使用.NET的nHibernate(可能还有Hibernate)轻松完成,但我更喜欢针对JPA编程,因为我在Java EE环境中。
答案 0 :(得分:1)
答案 1 :(得分: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)可能会有所帮助。