Динамическое сопоставление сущности с несколькими таблицами

Я просто искал динамическое сопоставление с 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?

Спасибо.


person Daniel Yang    schedule 07.08.2013    source источник


Ответы (2)


Имя таблицы SQL отображается в класс сущностей с использованием конфигурации/аннотации xml, поэтому я сомневаюсь, что вы можете изменить его во время выполнения.

Единственный способ, о котором я могу думать, - это использовать собственный запрос диспетчера сущностей, например:

String sql = "select xyz from " + tableName;
List<MyEntity> reuslt = em.createNativeQuery(sql, MyEntity.class).getResultList();
person gerrytan    schedule 07.08.2013
comment
Операция «Обновление» может использовать функцию «собственного обновления»? Я хочу подключить свою настройку к классам API метаданных JPA, но я не уверен в этом. - person Daniel Yang; 07.08.2013
comment
Да, вы можете использовать вариант, который не принимает параметр класса: createNativeQuery(java.lang.String sqlString) - person gerrytan; 07.08.2013

Я бы создал три подкласса Account (DraftAccount, ActiveAccount, HistoricalAccount) и использовал наследование @MappedSuperclass или TABLE_PER_CLASS. Чтобы переключить учетную запись, вы должны удалить старую учетную запись и создать новую.

Другой альтернативой является определение VIEW, чтобы три таблицы выглядели как одна (или фактически изменялись, чтобы иметь одну таблицу со столбцом TYPE).

Вы можете настроить операции EclipseLink, используя собственный SQL, хранимую процедуру или перенаправители запросов, но я бы рекомендовал изменить вашу модель, а не подделывать ее под ней.

person James    schedule 07.08.2013