2015-04-29 1 views
1

Я работаю с Java EE 7 на сервере Wildfly. У меня странный сценарий, где у клиента две таблицы - «сотрудники» и «employee_modified». Вторая таблица имеет ту же структуру, что и первая, а серверы - как хранилище модификаций. Таким образом, если работник меняет свое название от «сортира» в «сортир-1», мы будем писать employees_modifiedJPA - Перенаправление одной сущности Обновление/удаление операторов в зеркальную таблицу

insert into employees_modified(first_name) values("john") 

Пожалуйста, обратите внимание, что другие поля в таблице «employees_modified» пустые.

Вопрос в следующем: существует ли способ как-то сопоставить две таблицы и переписать значения из сотрудников теми, кто находится в employee_modified, где они присутствуют.

Я посмотрел на @Inheritance (стратегия = InheritanceType.TABLE_PER_CLASS) и @AttributeOverrides, но эти решения, похоже, не соответствуют моему сценарию.

+1

Я хотел бы предложить триггер MySQL таблицы – StanislavL

+0

кажется каскадным дает вам требование. –

+0

Я думаю, что предложение StanisIavL, вероятно, лучший способ действий. –

ответ

2

Посмотрите на hibernate envers, он решает вашу проблему просто. Присоедините к вашему проекту. Поместите первую аудиторскую таблицу с аннотацией @Audited и @AuditTable (value = "employees_modified"). Но, как указал @Predrag Maric, важно оставить остальные поля второй таблицы пустым, вы можете использовать метод @PostPersist (или прослушиватель в чистом гибернате) в сущности. В этом методе вы можете описать создание и сохранение дополнительной логики employee_modified.

+0

Envers будет заполнять все поля в таблице аудита, а не только измененные. –

+0

@sashok_bg это важно для вас? –

+0

@ Александр Федюков в этот момент - да. Я думаю, однако, что ENVERS - это решение в моем случае, поскольку вся идея заключалась в том, чтобы создать аудит и ревизии для таблицы «emplyee», но это было сделано очень плохо. Я начну работу над решением envers и посмотрю, как он подходит.Спасибо вам всем ! –

0

Если это только для аудита, я согласен с ответами на вопросы (триггеры, события и т. Д.).

Если вы действительно хотите получить доступ к этой таблице «employees_modified» (например, выполнить сложные запросы Hibernate), вы можете использовать второй постоянный блок. Следующая запись: https://developer.jboss.org/thread/237078, кажется, указывает, что это рекомендация из спящего режима. Очевидно, что для второго блока потребуется xml-конфигурация, а не аннотация - по крайней мере, она не может полагаться на одну и ту же аннотацию @Table.

BTW есть также документация об аннотации @SecondaryTable, но я понимаю, что это не соответствует вашему делу (потому что вашему бизнесу, вероятно, придется обрабатывать эти таблицы по-разному - иногда вы хотите просмотреть только историю, а иногда просто оперативные данные)/

1

Вы можете использовать @SQLUpdate и @SQLDelete настраивать заявления CRUD быть redirected to a different table:

@Entity 
@SQLUpdate(sql="UPDATE employees_modified SET name = ? WHERE id = ?") 
@SQLDelete(sql="DELETE FROM employees_modified WHERE id = ?") 
public class Employees { 
    ... 
} 
+0

Эти аннотации переопределяют поведение по умолчанию текущего объекта. Как он решает проблему? –

+0

Согласно комментарию OP: «да, первая таблица неизменна, а модификации сохраняются только во втором». Таким образом, таблица Employees остается неизменной, никакие строки не могут быть удалены, и все изменения перенаправляются в другую таблицу. Имеет смысл? –