|
|
|
@ -15,7 +15,15 @@ |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
package org.springframework.data.envers.repository.support; |
|
|
|
package org.springframework.data.envers.repository.support; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static org.springframework.data.history.RevisionMetadata.RevisionType.*; |
|
|
|
|
|
|
|
|
|
|
|
import jakarta.persistence.EntityManager; |
|
|
|
import jakarta.persistence.EntityManager; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import java.util.Optional; |
|
|
|
|
|
|
|
|
|
|
|
import org.hibernate.Hibernate; |
|
|
|
import org.hibernate.Hibernate; |
|
|
|
import org.hibernate.envers.AuditReader; |
|
|
|
import org.hibernate.envers.AuditReader; |
|
|
|
import org.hibernate.envers.AuditReaderFactory; |
|
|
|
import org.hibernate.envers.AuditReaderFactory; |
|
|
|
@ -43,13 +51,6 @@ import org.springframework.data.repository.history.support.RevisionEntityInforma |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
import org.springframework.util.Assert; |
|
|
|
import org.springframework.util.Assert; |
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList; |
|
|
|
|
|
|
|
import java.util.Collections; |
|
|
|
|
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
import java.util.Optional; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import static org.springframework.data.history.RevisionMetadata.RevisionType.*; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
/** |
|
|
|
* Repository implementation using Hibernate Envers to implement revision specific query methods. |
|
|
|
* Repository implementation using Hibernate Envers to implement revision specific query methods. |
|
|
|
* |
|
|
|
* |
|
|
|
@ -61,6 +62,8 @@ import static org.springframework.data.history.RevisionMetadata.RevisionType.*; |
|
|
|
* @author Mark Paluch |
|
|
|
* @author Mark Paluch |
|
|
|
* @author Sander Bylemans |
|
|
|
* @author Sander Bylemans |
|
|
|
* @author Niklas Loechte |
|
|
|
* @author Niklas Loechte |
|
|
|
|
|
|
|
* @author Donghun Shin |
|
|
|
|
|
|
|
* @author Greg Turnquist |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
@Transactional(readOnly = true) |
|
|
|
@Transactional(readOnly = true) |
|
|
|
public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N>> |
|
|
|
public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N>> |
|
|
|
@ -73,12 +76,12 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N |
|
|
|
* Creates a new {@link EnversRevisionRepositoryImpl} using the given {@link JpaEntityInformation}, |
|
|
|
* Creates a new {@link EnversRevisionRepositoryImpl} using the given {@link JpaEntityInformation}, |
|
|
|
* {@link RevisionEntityInformation} and {@link EntityManager}. |
|
|
|
* {@link RevisionEntityInformation} and {@link EntityManager}. |
|
|
|
* |
|
|
|
* |
|
|
|
* @param entityInformation must not be {@literal null}. |
|
|
|
* @param entityInformation must not be {@literal null}. |
|
|
|
* @param revisionEntityInformation must not be {@literal null}. |
|
|
|
* @param revisionEntityInformation must not be {@literal null}. |
|
|
|
* @param entityManager must not be {@literal null}. |
|
|
|
* @param entityManager must not be {@literal null}. |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
public EnversRevisionRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, |
|
|
|
public EnversRevisionRepositoryImpl(JpaEntityInformation<T, ?> entityInformation, |
|
|
|
RevisionEntityInformation revisionEntityInformation, EntityManager entityManager) { |
|
|
|
RevisionEntityInformation revisionEntityInformation, EntityManager entityManager) { |
|
|
|
|
|
|
|
|
|
|
|
Assert.notNull(revisionEntityInformation, "RevisionEntityInformation must not be null!"); |
|
|
|
Assert.notNull(revisionEntityInformation, "RevisionEntityInformation must not be null!"); |
|
|
|
|
|
|
|
|
|
|
|
@ -136,7 +139,6 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N |
|
|
|
return Revisions.of(revisionList); |
|
|
|
return Revisions.of(revisionList); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private AuditOrder mapRevisionSort(RevisionSort revisionSort) { |
|
|
|
private AuditOrder mapRevisionSort(RevisionSort revisionSort) { |
|
|
|
|
|
|
|
|
|
|
|
return RevisionSort.getRevisionDirection(revisionSort).isDescending() //
|
|
|
|
return RevisionSort.getRevisionDirection(revisionSort).isDescending() //
|
|
|
|
@ -154,9 +156,9 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N |
|
|
|
for (Sort.Order order : sort) { |
|
|
|
for (Sort.Order order : sort) { |
|
|
|
|
|
|
|
|
|
|
|
AuditProperty<Object> property = AuditEntity.property(order.getProperty()); |
|
|
|
AuditProperty<Object> property = AuditEntity.property(order.getProperty()); |
|
|
|
AuditOrder auditOrder = order.getDirection().isAscending() ? |
|
|
|
AuditOrder auditOrder = order.getDirection().isAscending() //
|
|
|
|
property.asc() : |
|
|
|
? property.asc() //
|
|
|
|
property.desc(); |
|
|
|
: property.desc(); |
|
|
|
|
|
|
|
|
|
|
|
result.add(auditOrder); |
|
|
|
result.add(auditOrder); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -169,9 +171,9 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N |
|
|
|
|
|
|
|
|
|
|
|
AuditQuery baseQuery = createBaseQuery(id); |
|
|
|
AuditQuery baseQuery = createBaseQuery(id); |
|
|
|
|
|
|
|
|
|
|
|
List<AuditOrder> orderMapped = (pageable.getSort() instanceof RevisionSort revisionSort) ? |
|
|
|
List<AuditOrder> orderMapped = (pageable.getSort()instanceof RevisionSort revisionSort) |
|
|
|
Collections.singletonList(mapRevisionSort(revisionSort)) : |
|
|
|
? List.of(mapRevisionSort(revisionSort)) |
|
|
|
mapPropertySort(pageable.getSort()); |
|
|
|
: mapPropertySort(pageable.getSort()); |
|
|
|
|
|
|
|
|
|
|
|
orderMapped.forEach(baseQuery::addOrder); |
|
|
|
orderMapped.forEach(baseQuery::addOrder); |
|
|
|
|
|
|
|
|
|
|
|
@ -235,17 +237,17 @@ public class EnversRevisionRepositoryImpl<T, ID, N extends Number & Comparable<N |
|
|
|
return metadata instanceof DefaultRevisionEntity defaultRevisionEntity //
|
|
|
|
return metadata instanceof DefaultRevisionEntity defaultRevisionEntity //
|
|
|
|
? new DefaultRevisionMetadata(defaultRevisionEntity, revisionType) //
|
|
|
|
? new DefaultRevisionMetadata(defaultRevisionEntity, revisionType) //
|
|
|
|
: new AnnotationRevisionMetadata<>(Hibernate.unproxy(metadata), RevisionNumber.class, RevisionTimestamp.class, |
|
|
|
: new AnnotationRevisionMetadata<>(Hibernate.unproxy(metadata), RevisionNumber.class, RevisionTimestamp.class, |
|
|
|
revisionType); |
|
|
|
revisionType); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static RevisionMetadata.RevisionType convertRevisionType(RevisionType datum) { |
|
|
|
private static RevisionMetadata.RevisionType convertRevisionType(RevisionType datum) { |
|
|
|
|
|
|
|
|
|
|
|
return switch (datum) { |
|
|
|
return switch (datum) { |
|
|
|
case ADD -> INSERT; |
|
|
|
case ADD -> INSERT; |
|
|
|
case MOD -> UPDATE; |
|
|
|
case MOD -> UPDATE; |
|
|
|
case DEL -> DELETE; |
|
|
|
case DEL -> DELETE; |
|
|
|
default -> UNKNOWN; |
|
|
|
default -> UNKNOWN; |
|
|
|
}; |
|
|
|
}; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|