如何在部署级别在JPA persistence.xml中指定不同数量的持久性单元

时间:2011-03-10 14:24:43

标签: java hibernate jpa

我有一个J2SE程序,我正在使用JPA。现有的程序可以处理1到4个数据库。它所谈到的数据库依赖于特定于部署的表映射 - >数据库。当使用多个数据库时,这是因为某些表已转移到另一个数据库(数据库级别的水平分片,而不是表级别)。这是基于每个部署配置的 - 由用户决定他们希望如何构建他们的数据库设置。

现有代码如

Connection con = getConnectionBasedOnTable(domainObject.getClass());
// execute statement, etc...

使用(J2SE)JPA我想使用类似的东西:

EntityManager em = getEntityManagerBasedOnTable(domainObject.getClass());
// persist, etc...

间接的原因是因为不同的用户有不同的要求。小用户可能只有一个小型数据库,因此单个服务器就足够了。大型组织可能拥有庞大的数据库,因此我们通过在高性能服务器上放置高性能表来解决这个问题,等等。某些用户还使用它将敏感数据保存在(昂贵的)高安全性环境中,同时将非敏感数据保存在(廉价)中等安全环境中。所以没有一种尺寸适合所有数据库方法。因此间接。另请注意,符合分离条件的表没有任何外键约束问题。

既然我正在尝试迁移到JPA,我怎样才能允许最终用户定义他们的数据库结构?有没有办法以编程方式配置持久性单元?包括定义未在persistence.xml中指定的新持久性单元?我怎样才能实现目标?

我能想到以下几点:

  • 在persistence.xml中预定义100个左右的持久性单元:“db1”,“db2”等...并在外部配置文件中读取程序,该文件将属性应用于它们(Persistence.createEntityManagerFactory(name,properties) )。丑陋,限制。
  • 转到非JPA解决方案(我真的希望避免这种情况。我们希望使用JPA,因为它基于标准的性质。)
  • 部署特定于用户的JAR,或构建可编辑/修改JAR的persistence.xml以使用其设置的脚本。确实有点黑客。

对于它的价值,我们正在使用Hibernate的JPA实现。我已经找到了一种配置Hibernate JPA的方法,但没有取得任何成功。

2 个答案:

答案 0 :(得分:3)

我正在结束这个问题,因为没有合适的答案。对于那些感兴趣的人,我最终选择在XML文件中预定义所有可能的持久性单元组合。

编辑:现在是2013年,我需要重新审视这个问题,事实证明可以做到这一点。请参阅Is persistence.xml requied when working with Spring and Hibernate? - 您不需要使用Spring,但使用HibernatePersistence.createContainerEntityManagerFactory()的一般要点是关键。

答案 1 :(得分:0)

不确定它会对你有所帮助,但你可以试着看看Teiid是否解决了你的问题。这样,您可以将所有数据源聚合到一个点(Teiid),使其对您的数据来源的应用程序透明。