JPA / Hibernate:生成特定于事务的事务ID并设置为JPA父/子实体

时间:2013-09-26 07:18:32

标签: hibernate transactions jpa-2.0

我有两张表,如:

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'视为事务ID,并将其记录到两个表中,因为用户信息和地址将保存为一个事务。

现在,如果我更新用户名和地址:

 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'应该只进入地址表,因为我们没有更新用户信息,只有地址。

是否可以生成特定于JPA事务的事务ID并设置为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。有没有正确的方法来实现这个目标?

2 个答案:

答案 0 :(得分:0)

我有一个很好的解决方案来跟踪交易ID。我不需要在应用程序级别跟踪事务ID。我正在使用,更新/删除触发器,以便在我的表更新时存储与审计相关的信息。 Oracle触发那些在单个事务中执行的事件,它们也在同一事务下执行。我可以在触发器中使用“ dbms_transaction.local_transaction_id ”来获取事务ID,并在记录其他审计相关信息时记录此事件。

答案 1 :(得分:0)

不确定我的回答是否有帮助,但这看起来有点像JPA的乐观锁定版本,除了默认情况下每个实体都有自己的增加版本。如果JPA实现可以某种方式配置为使用事务id作为乐观锁定版本,那么问题可能会得到解决。