diff --git a/hapi-fhir-jpaserver-base/pom.xml b/hapi-fhir-jpaserver-base/pom.xml index 3abe003466f..3d6dcc4b4fb 100644 --- a/hapi-fhir-jpaserver-base/pom.xml +++ b/hapi-fhir-jpaserver-base/pom.xml @@ -350,6 +350,10 @@ org.hibernate hibernate-envers + + org.springframework.data + spring-data-envers + org.apache.lucene lucene-analyzers-phonetic diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/JpaConfig.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/JpaConfig.java index c7b4ecb8423..9efa473ff2f 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/JpaConfig.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/config/JpaConfig.java @@ -162,6 +162,7 @@ import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Scope; import org.springframework.core.task.AsyncTaskExecutor; +import org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.scheduling.TaskScheduler; import org.springframework.scheduling.concurrent.ConcurrentTaskScheduler; @@ -193,7 +194,7 @@ import java.util.Date; */ @Configuration -@EnableJpaRepositories(basePackages = "ca.uhn.fhir.jpa.dao.data") +@EnableJpaRepositories(basePackages = "ca.uhn.fhir.jpa.dao.data", repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class) @Import({ BeanPostProcessorConfig.class, TermCodeSystemConfig.class, diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/IMdmLinkJpaRepository.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/IMdmLinkJpaRepository.java index e15f4e2d11c..8f7a89a498d 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/IMdmLinkJpaRepository.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/data/IMdmLinkJpaRepository.java @@ -26,6 +26,7 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.history.RevisionRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; @@ -34,7 +35,9 @@ import java.util.List; import java.util.Optional; @Repository -public interface IMdmLinkJpaRepository extends JpaRepository, IHapiFhirJpaRepository { +//TODO: Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'mdmLinkDao': Unsatisfied dependency expressed through field 'myMdmLinkDao'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'IMdmLinkJpaRepository' defined in ca.uhn.fhir.jpa.dao.data.IMdmLinkJpaRepository defined in @EnableJpaRepositories declared on BaseAppCtxPersistence: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.Optional org.springframework.data.repository.history.RevisionRepository.findRevision(java.lang.Object,java.lang.Number); Reason: Failed to create query for method public abstract java.util.Optional org.springframework.data.repository.history.RevisionRepository.findRevision(java.lang.Object,java.lang.Number)! No property 'findRevision' found for type 'MdmLink'; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.Optional org.springframework.data.repository.history.RevisionRepository.findRevision(java.lang.Object,java.lang.Number)! No property 'findRevision' found for type 'MdmLink' +public interface IMdmLinkJpaRepository extends RevisionRepository,JpaRepository, IHapiFhirJpaRepository { +//public interface IMdmLinkJpaRepository extends JpaRepository, IHapiFhirJpaRepository { @Modifying @Query("DELETE FROM MdmLink f WHERE myGoldenResourcePid = :pid OR mySourcePid = :pid") int deleteWithAnyReferenceToPid(@Param("pid") Long thePid); diff --git a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/mdm/MdmLinkDaoJpaImpl.java b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/mdm/MdmLinkDaoJpaImpl.java index 0e122b87981..aec27712b4c 100644 --- a/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/mdm/MdmLinkDaoJpaImpl.java +++ b/hapi-fhir-jpaserver-base/src/main/java/ca/uhn/fhir/jpa/dao/mdm/MdmLinkDaoJpaImpl.java @@ -38,12 +38,15 @@ import ca.uhn.fhir.rest.server.exceptions.UnprocessableEntityException; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.collections4.ListUtils; import org.hl7.fhir.instance.model.api.IIdType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.domain.Example; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageImpl; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.history.Revisions; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; @@ -71,6 +74,8 @@ import static ca.uhn.fhir.mdm.api.MdmQuerySearchParameters.RESOURCE_TYPE_NAME; import static ca.uhn.fhir.mdm.api.MdmQuerySearchParameters.SOURCE_PID_NAME; public class MdmLinkDaoJpaImpl implements IMdmLinkDao { + private static final Logger ourLog = LoggerFactory.getLogger(MdmLinkDaoJpaImpl.class); + @Autowired IMdmLinkJpaRepository myMdmLinkDao; @Autowired @@ -229,6 +234,9 @@ public class MdmLinkDaoJpaImpl implements IMdmLinkDao { Long totalResults = myEntityManager.createQuery(countQuery).getSingleResult(); MdmPageRequest pageRequest = theParams.getPageRequest(); + // TODO: remove this + findHistory(); + List result = typedQuery .setFirstResult(pageRequest.getOffset()) .setMaxResults(pageRequest.getCount()) @@ -300,4 +308,13 @@ public class MdmLinkDaoJpaImpl implements IMdmLinkDao { myMdmLinkDao.deleteLinksWithAnyReferenceToPids(chunk); } } + + @Override + public void findHistory() { + // TODO: need to extend RevisionRepository.... somewhere + long hardCodedMdmLinkId = 1L; + final Revisions revisions = myMdmLinkDao.findRevisions(hardCodedMdmLinkId); + + revisions.forEach(revision -> ourLog.info("MdmLink revision: {}", revision)); + } } diff --git a/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/dao/IMdmLinkDao.java b/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/dao/IMdmLinkDao.java index e3532a36f7a..9d92b0576ef 100644 --- a/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/dao/IMdmLinkDao.java +++ b/hapi-fhir-server-mdm/src/main/java/ca/uhn/fhir/mdm/dao/IMdmLinkDao.java @@ -82,4 +82,6 @@ public interface IMdmLinkDao

findBySourcePidAndMatchResult(P theSourcePid, MdmMatchResultEnum theMatch); void deleteLinksWithAnyReferenceToPids(List

theResourcePersistentIds); + + void findHistory(); } diff --git a/pom.xml b/pom.xml index 4488398c01f..21c730f7b15 100644 --- a/pom.xml +++ b/pom.xml @@ -1764,6 +1764,11 @@ hibernate-envers ${hibernate_version} + + org.springframework.data + spring-data-envers + ${spring_boot_version} + org.hibernate.validator hibernate-validator