将实体动态映射到多个表

时间:2013-08-07 05:16:00

标签: java jpa eclipselink

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

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元数据类中吗?

感谢。

2 个答案:

答案 0 :(得分:0)

使用xml配置/注释将SQL表名映射到实体类中,因此我怀疑您是否可以在运行时更改它

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

String sql = "select xyz from " + tableName;
List<MyEntity> reuslt = em.createNativeQuery(sql, MyEntity.class).getResultList();

答案 1 :(得分:0)

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

另一个替代方法是定义一个VIEW以使三个表看起来像一个(或实际上改为使一个表具有TYPE列)。

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