【发布时间】:2011-07-12 18:30:01
【问题描述】:
我有一个 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 的方法,但没有任何成功。
【问题讨论】: