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

JPA/Hibernate:生成特定于事务的事务id并设置为JPA父/子实体,hibernate,transactions,jpa-2.0,Hibernate,Transactions,Jpa 2.0,我有两张桌子,像: User [ UserId, FirstName, LastName, AddressId (#FK), UITransactionId ] Address [ AddressId, city, state, UITransactionId] UITransactionId用于捕获特定的事务更改。例如,我有一个添加页面,可以在其中填写用户名、姓氏和地址。如果我保存下面的用户,记录将添加到表中 User [ U1, Narendra, Verma , A1 , 1234

我有两张桌子,像:

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。有没有合适的方法来实现这一点?

我找到了跟踪事务id的好解决方案。我不需要在应用程序级别跟踪事务id。每当我的表被更新时,我使用更新/删除触发器来存储审计相关信息。Oracle触发器在单个事务中执行,它们也在同一事务下执行。我可以使用触发器本身中的“dbms\u transaction.local\u transaction\u id”获取事务id,并在记录其他审计相关信息时记录此id

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