Hibernate Envers inserts same revision into two audit records in same transaction

63 Views Asked by At

I have problem, becouse while same transaction I want to insert new order Entity, and delete another as below.

@Transactional 
public void execute(OrderEntity orderToRenew) {
        OrderEntity newOrder = orderRepositoryPort.save(new OrderEntity(orderToRenew, orderToRenew.getEmailRequestId(), OrderDeliveryStatus.IN_PROGRESS));

        orderRepositoryPort.deleteById(orderToRenew.getId());
}

From logs I can see, that envers invokes 2 inserts into t_order_aud with same revision, which cause excpetion:

2023-11-21T17:26:23.088+01:00 DEBUG 24232 --- [nio-8084-exec-1] org.hibernate.SQL                        : delete from t_order where id=?
2023-11-21T17:26:23.089+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [1] as [BIGINT] - [1]
2023-11-21T17:26:23.092+01:00 DEBUG 24232 --- [nio-8084-exec-1] org.hibernate.SQL                        : insert into revinfo (rev, revtstmp) values (default, ?)               
2023-11-21T17:26:23.092+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [1] as [BIGINT] - [1700583983091]

                                          FIRST INSERT T_ORDER_AUD BELOW (with rev = 1)
                                          
2023-11-21T17:26:23.095+01:00 DEBUG 24232 --- [nio-8084-exec-1] org.hibernate.SQL                        : insert into t_order_aud (revtype, modified_by, modify_date, channel, create_date, delivery_status, email_request_id, error_info, file_location, message_id, order_status, report_request_id, sent_date, sms_request_id, rev, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [2] as [VARCHAR] - [ANONYMOUS_USER]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [3] as [TIMESTAMP] - [2023-11-21T17:26:23.072916200]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [4] as [VARCHAR] - [EMAIL]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [5] as [TIMESTAMP] - [2021-07-23T00:00]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [6] as [VARCHAR] - [FAILURE]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [7] as [BIGINT] - [1]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [8] as [VARCHAR] - [Niespodziewany błąd]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [9] as [VARCHAR] - [null]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [10] as [VARCHAR] - [3d87f-3458-414e-8649-047cb8ca29fd-144-0]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [11] as [VARCHAR] - [FAILURE]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [12] as [BIGINT] - [null]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [13] as [TIMESTAMP] - [null]
2023-11-21T17:26:23.095+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [14] as [BIGINT] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [15] as [INTEGER] - [1]        <<<<------- REV = 1
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [16] as [BIGINT] - [3]

                                   SECOND INSERT T_ORDER_AUD BELOW (with rev = 1)
                                   
2023-11-21T17:26:23.096+01:00 DEBUG 24232 --- [nio-8084-exec-1] org.hibernate.SQL                        : insert into t_order_aud (revtype, modified_by, modify_date, channel, create_date, delivery_status, email_request_id, error_info, file_location, message_id, order_status, report_request_id, sent_date, sms_request_id, rev, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [2] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [3] as [TIMESTAMP] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [4] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [5] as [TIMESTAMP] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [6] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [7] as [BIGINT] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [8] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [9] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [10] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [11] as [VARCHAR] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [12] as [BIGINT] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [13] as [TIMESTAMP] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [14] as [BIGINT] - [null]
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [15] as [INTEGER] - [1]          <<<<--------- REV = 1
2023-11-21T17:26:23.096+01:00 TRACE 24232 --- [nio-8084-exec-1] org.hibernate.orm.jdbc.bind              : binding parameter [16] as [BIGINT] - [1]
2023-11-21T17:26:23.099+01:00  WARN 24232 --- [nio-8084-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 23505, SQLState: 23505
2023-11-21T17:26:23.099+01:00 ERROR 24232 --- [nio-8084-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : Naruszenie ograniczenia Klucza Głównego lub Indeksu Unikalnego: "PRIMARY KEY ON PUBLIC.t_order_aud(rev) ( /* key:1 */ CAST(3 AS BIGINT), 'sopel_aaf3d87f-3458-414e-8649-047cb8ca29fd-144-0', 'EMAIL', 'FAILURE', 'FAILURE', U&'Niespodziewany b\\0142\\0105d', NULL, NULL, CAST(1 AS BIGINT), NULL, TIMESTAMP '2021-07-23 00:00:00', TIMESTAMP '2023-11-21 17:26:23.072916', 'ANONYMOUS_USER', 1, CAST(0 AS TINYINT), NULL)"
Unique index or primary key violation: "PRIMARY KEY ON PUBLIC.t_order_aud(rev) ( /* key:1 */ CAST(3 AS BIGINT), 'sopel_aaf3d87f-3458-414e-8649-047cb8ca29fd-144-0', 'EMAIL', 'FAILURE', 'FAILURE', U&'Niespodziewany b\\0142\\0105d', NULL, NULL, CAST(1 AS BIGINT), NULL, TIMESTAMP '2021-07-23 00:00:00', TIMESTAMP '2023-11-21 17:26:23.072916', 'ANONYMOUS_USER', 1, CAST(0 AS TINYINT), NULL)"; SQL statement:
insert into t_order_aud (revtype, modified_by, modify_date, channel, create_date, delivery_status, email_request_id, error_info, file_location, message_id, order_status, report_request_id, sent_date, sms_request_id, rev, id) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [23505-214]
2023-11-21T17:26:23.100+01:00  INFO 24232 --- [nio-8084-exec-1] o.h.e.j.b.internal.AbstractBatchImpl     : HHH000010: On release of batch it still contained JDBC statements
2023-11-21T17:26:23.108+01:00 ERROR 24232 --- [nio-8084-exec-1] p.p.s.p.a.rest.GlobalExceptionHandler    : Unable to perform beforeTransactionCompletion callback: Converting `org.hibernate.exception.ConstraintViolationException` to JPA `PersistenceException` : could not execute statement

First time i have such problem, that envers inserts same ids into two different aud objects. I would be gratefull if someone can explain me how can I solve this

1

There are 1 best solutions below

0
Raba_Ababa On

I found solution. On my table t_order_aud I had primaryKey constraint set only on "rev" column. I set primaryKey as combined on columns (rev,id) and it worked now.