0

我刚刚用 eclipselink 搜索了动态映射,我找不到适合我的情况的解决方案,现在在我的系统中,一个实体有 3 个版本,一个正在工作/草稿(即 W100),另一个是生产(即 M100),剩下的一个是历史版本(H100),我们可以随时访问工作、生产和历史版本。IE

Account account = // query from working.
account.setStatus("APPROVED");
account.increaseVersionNo();
myJPAEngine.updateApproved(account); // this step update status to both working and production
//, and W100.PRODUCTION_IPKEY = M100.IPKEY 
// (if production version does't exist
//, create a new one with same columns as working version).
//, if increaseVersionNo() called, then we need copy old 'M'- production record to 'H' history version table.
//, my JPA engine need access both 'W'/'M'/'H' tables at same time by passing a parameter to JPA API metadata classes by ThreadLocal or other related workaround.

eclipselink(或 Hibernate)是否支持这个?我的动态映射接受一个参数来决定使用哪个表,也就是说这是一个交互式动态映射。我们可以以及如何将一些自定义插入到 eclipselink 元数据类中?

谢谢。

4

2 回答 2

0

我将创建 Account 的三个子类(DraftAccount、ActiveAccount、HistoricalAccount)并使用 @MappedSuperclass 或 TABLE_PER_CLASS 继承。要切换帐户,您将删除旧帐户并创建一个新帐户。

另一种选择是定义一个 VIEW 以使三个表看起来像一个(或实际上更改为一个具有 TYPE 列的表)。

您可以使用自定义 SQL、存储过程或查询重定向器来自定义 EclipseLink 操作,但我建议您更改模型而不是在下面伪造它。

于 2013-08-07T13:33:53.193 回答
0

SQL表名使用xml配置/注释映射到实体类,所以我怀疑你可以在运行时更改它

我能想到的唯一方法是使用实​​体管理器本机查询,例如:

String sql = "select xyz from " + tableName;
List<MyEntity> reuslt = em.createNativeQuery(sql, MyEntity.class).getResultList();
于 2013-08-07T05:25:27.663 回答