Class JpaTrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>

  • All Implemented Interfaces:
    com.broadleafcommerce.common.extension.DomainTypeAware, com.broadleafcommerce.common.messaging.notification.NotificationStateRepository, com.broadleafcommerce.data.tracking.core.TrackableRepository<D>, org.springframework.data.repository.Repository<D,​String>

    public class JpaTrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
    extends JpaTrackableNotificationStateRepository
    implements com.broadleafcommerce.data.tracking.core.TrackableRepository<D>
    Version of TrackableRepository backed by Jpa. Generally, platform specific repositories will be enabled via EnableJpaRepositories annotation on a Spring configuration class. For example, you may enable Jpa repository support with a configuration class similar to this:
     @Configuration
     @EnableJpaRepositories(repositoryFactoryBeanClass = NarrowingJpaRepositoryFactoryBean.class)
     public class JpaConfig {
    
     }
     
    By default, a JpaTrackableRepository will return every polymorphic variation of entity matching a query in the datastore. This can happen when polymorphic variation is modeled in the domain classes. In such situations, a JpaRepositoryEntityTypeOverride bean can be declared that explicitly denotes the type that should be filtered in queries by this repository. You should only have to think about this if you have one or more extensions of a parent entity populated. Furthermore, if the system detects there is no sibling polymorphism (i.e. only a single line of inheritance), it will automatically infer the most derived type for this repository (it will also automatically register a TypeFactory member for the extension if one is not already present). This is a performance enhancement, as the ORM layer will be able to optimize the resulting query when it is made specific to a derived type. This behavior can be changed at any time by declaring a JpaRepositoryEntityTypeOverride to a higher level domain class, at which point polymorphic variation is reintroduced in query results at the cost of a more expensive query.

    Note, there is no out-of-the-box support for polymorphic awareness at the REST controller layer. It is generally indicated here to model variation via composition (or similar), rather than inheritance.
    Author:
    Jeff Fischer
    • Constructor Detail

      • JpaTrackableRepository

        public JpaTrackableRepository​(org.springframework.data.jpa.repository.support.JpaEntityInformation<D,​String> metadata,
                                      javax.persistence.EntityManager em)
    • Method Detail

      • getEntityInformation

        public org.springframework.data.jpa.repository.support.JpaEntityInformation<D,​String> getEntityInformation()
        Specified by:
        getEntityInformation in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • save

        @NonNull
        @Transactional
        public D save​(@NonNull
                      D entity,
                      @Nullable
                      com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        save in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • applyTransientTrackingStateIfApplicable

        protected void applyTransientTrackingStateIfApplicable​(com.broadleafcommerce.data.tracking.core.Trackable trackable)
      • loadTransientTrackingStateIfApplicable

        protected void loadTransientTrackingStateIfApplicable​(com.broadleafcommerce.data.tracking.core.Trackable trackable)
      • applyLock

        protected void applyLock​(D managed)
        Apply JPA locking strategies if required. By default, only applies LockModeType.OPTIMISTIC when the entity being saved is versioned. This is explicitly called after a merge because locking requires a managed instance, and there is no need to lock after a persist since the entity is brand new and there cannot be any update conflicts. The lock doesn't immediately do anything, but schedules an action for when the persistence context is flushed to verify the version.
        Parameters:
        managed - the managed instance to apply the lock to
      • saveAll

        @NonNull
        @Transactional
        public Iterable<D> saveAll​(@NonNull
                                   Iterable<D> entities,
                                   @Nullable
                                   com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        saveAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findMinSortMember

        @Nullable
        public com.broadleafcommerce.data.tracking.core.sort.domain.Sortable findMinSortMember​(@NonNull
                                                                                               com.broadleafcommerce.data.tracking.core.sort.domain.Sortable example,
                                                                                               @Nullable
                                                                                               String minSort,
                                                                                               @Nullable
                                                                                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findMinSortMember in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findMaxSortMember

        @Nullable
        public com.broadleafcommerce.data.tracking.core.sort.domain.Sortable findMaxSortMember​(@NonNull
                                                                                               com.broadleafcommerce.data.tracking.core.sort.domain.Sortable example,
                                                                                               @Nullable
                                                                                               String maxSort,
                                                                                               @Nullable
                                                                                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findMaxSortMember in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findByContextId

        @NonNull
        public Optional<D> findByContextId​(@NonNull
                                           String contextId,
                                           @Nullable
                                           com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findByContextId in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findByContextIdAndCatalog

        @NonNull
        public Optional<D> findByContextIdAndCatalog​(@NonNull
                                                     String contextId,
                                                     @NonNull
                                                     String catalogId,
                                                     @Nullable
                                                     com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findByContextIdAndCatalog in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • existsByContextId

        public boolean existsByContextId​(@NonNull
                                         String contextId,
                                         @Nullable
                                         com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        existsByContextId in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • archive

        @NonNull
        @Transactional
        public D archive​(@NonNull
                         D entity,
                         @Nullable
                         com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        archive in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        @NonNull
        public List<D> findAll​(@Nullable
                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAllByContextId

        @NonNull
        public Iterable<D> findAllByContextId​(@NonNull
                                              Iterable<String> contextIds,
                                              @Nullable
                                              com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findAllByContextId in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        @NonNull
        public org.springframework.data.domain.Page<D> findAll​(@NonNull
                                                               org.springframework.data.domain.Pageable pageable,
                                                               @Nullable
                                                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        @NonNull
        public List<D> findAll​(@NonNull
                               org.springframework.data.domain.Sort sort,
                               @Nullable
                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo)
        Specified by:
        findAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        @NonNull
        public List<D> findAll​(@Nullable
                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                               @NonNull
                               Class<D> type)
        Specified by:
        findAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        @NonNull
        public org.springframework.data.domain.Page<D> findAll​(@NonNull
                                                               org.springframework.data.domain.Pageable pageable,
                                                               @Nullable
                                                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                                               @NonNull
                                                               Class<D> type)
        Specified by:
        findAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        @NonNull
        public List<D> findAll​(@NonNull
                               org.springframework.data.domain.Sort sort,
                               @Nullable
                               com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                               @NonNull
                               Class<D> type)
        Specified by:
        findAll in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • purgeObsoleteSandboxData

        public void purgeObsoleteSandboxData​(Duration beforeNow)
        Specified by:
        purgeObsoleteSandboxData in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • pruneRestingNotificationStates

        public void pruneRestingNotificationStates​(@NonNull
                                                   Duration beforeNow)
        Specified by:
        pruneRestingNotificationStates in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • pruneChangeDetails

        @Transactional(propagation=REQUIRES_NEW)
        public boolean pruneChangeDetails​(@NonNull @NonNull
                                          @NonNull Object nativeId)
        Specified by:
        pruneChangeDetails in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • setTrackableBehaviorUtil

        public void setTrackableBehaviorUtil​(com.broadleafcommerce.data.tracking.core.TrackableBehaviorUtil behaviorUtil)
        Specified by:
        setTrackableBehaviorUtil in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • setJpaProperties

        public void setJpaProperties​(JpaProperties properties)
      • setRepositoryEntityTypeManager

        public void setRepositoryEntityTypeManager​(com.broadleafcommerce.common.jpa.RepositoryEntityTypeManager repositoryEntityTypeManager)
      • getTrackableBehaviorUtil

        public com.broadleafcommerce.data.tracking.core.TrackableBehaviorUtil getTrackableBehaviorUtil()
        Specified by:
        getTrackableBehaviorUtil in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • getTypesToRegisterInMappingContext

        public List<Class<?>> getTypesToRegisterInMappingContext()
        Specified by:
        getTypesToRegisterInMappingContext in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findByNativeId

        @NonNull
        public Optional<D> findByNativeId​(@NonNull @NonNull
                                          @NonNull Object id)
        Specified by:
        findByNativeId in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findTarget

        public D findTarget​(String contextId,
                            String catalogId,
                            String applicationId,
                            String author,
                            String stage,
                            String sandboxId,
                            Integer level,
                            Set<String> visibleFromCatalog)
        Specified by:
        findTarget in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findOriginal

        public D findOriginal​(String contextId,
                              String catalogId,
                              String applicationId,
                              String author,
                              String stage,
                              String sandboxId,
                              Integer level)
        Specified by:
        findOriginal in interface com.broadleafcommerce.data.tracking.core.TrackableRepository<D extends com.broadleafcommerce.data.tracking.core.Trackable>
      • findAll

        protected List<D> findAll​(@Nullable
                                  javax.persistence.criteria.CriteriaQuery<D> query,
                                  com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                  Class<D> type,
                                  Map<String,​Object> params)
        Find all matching entities given a query.
        Parameters:
        query - The fetch query to execute
        contextInfo - Additional context information for the fetch - primarily used for narrowing.
        Returns:
        the final query results, possibly narrowed via JpaNarrowExecutor.
      • findAll

        protected List<D> findAll​(@Nullable
                                  javax.persistence.criteria.CriteriaQuery<D> query,
                                  com.broadleafcommerce.data.tracking.core.context.ContextInfo contextInfo,
                                  Class<D> type)