2013-09-26 3 views
0

У меня есть две таблицы, как:JPA/Hibernate: Создание идентификатора транзакции, специфичный для транзакции и установки в JPA родителя/потомок лицо

User [ UserId, FirstName, LastName, AddressId (#FK), UITransactionId ] 
Address [ AddressId, city, state, UITransactionId] 

UITransactionId является захватом конкретных изменений транзакций. Например, у меня есть страница добавления, где я могу заполнить имя пользователя, фамилию и адрес. И если я сохраню пользователя ниже, записи будут добавлены в таблицу.

User [ U1, Narendra, Verma , A1 , 1234 ] 
Address [ A1, Pune, MH, 1234] 

UITransactionId «1234» может рассматриваться как идентификатор транзакции и вошел в обе таблицы в качестве пользовательской информации и адреса сохраняются в виде одной транзакции.

Теперь, если я обновлю имя пользователя и адрес:

User [ U1, NarendraEdit, Verma , A1 , 1255] 
Address [ A1, PuneEdit, MH, 1255] 

На этот раз «1255» Id будет представлять по мере внесения изменений как в таблице с одной транзакции.

Теперь Если изменить только адрес и сохранить информацию о пользователе:

User [ U1, Narendra, Verma , A1 , 1255 ] 
Address [ A1, Pune, MHEdit, 1295] //Only this table is updated 

На этот раз «1295» должен перейти в адресную таблицу только Becase мы не обновили информацию о пользователях, но только адрес.

Есть ли способ, с помощью которого я могу сгенерировать идентификатор транзакции, специфичный для транзакции JPA, и установить в родительские/дочерние объекты JPA?

@Transactional(readOnly = false, isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, rollbackFor = {Exception.class }) 
    public void saveUser(UserVO userVO) { 
    // Setting transaction Id into User/Address Entity 
    // Call dao layer to save/update entity 
    } 

Существует один способ, что я могу генерировать случайное число услуг при совершении сделки и установить явно каждый объект при сохранении/обновления конкретной организации. Но этот подход потребует установки UITransactionId в каждом месте для каждого объекта. Есть ли правильный способ достичь этого?

ответ

0

Я получил хорошее решение для отслеживания идентификатора транзакции. Мне не нужно отслеживать идентификатор транзакции на уровне приложения. Я использую триггеры обновления/удаления для хранения информации, связанной с аудитом, когда мои таблицы обновляются. Триггеры Oracle запускаются в одной транзакции, они также выполняются в рамках одной транзакции. Я могу получить идентификатор транзакции, используя 'dbms_transaction.local_transaction_id' в самом триггере и зарегистрировать это при регистрации другой связанной с аудитом информации.

0

Не уверен, что мой ответ помогает, но это немного похоже на оптимистичную версию блокировки JPA, за исключением того, что по умолчанию каждый объект имеет свою собственную версию, которая увеличивается. Вероятно, проблема будет решена, если реализация JPA может быть сконфигурирована так, чтобы использовать идентификатор транзакции в качестве версии оптимистичного замка.

Смежные вопросы