package com.jspxcms.common.orm; import static org.springframework.data.querydsl.QueryDslUtils.QUERY_DSL_PRESENT; import java.io.Serializable; import javax.persistence.EntityManager; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.support.JpaEntityInformation; import org.springframework.data.jpa.repository.support.JpaRepositoryFactory; import org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor; import org.springframework.data.jpa.repository.support.QueryDslJpaRepository; import org.springframework.data.jpa.repository.support.SimpleJpaRepository; import org.springframework.data.repository.core.RepositoryMetadata; /** * JPA Repository工厂 * * @author liufang * */ public class MyJpaRepositoryFactory extends JpaRepositoryFactory { private final LockModeRepositoryPostProcessor lockModePostProcessor; public MyJpaRepositoryFactory(EntityManager entityManager) { super(entityManager); this.lockModePostProcessor = LockModeRepositoryPostProcessor.INSTANCE; } protected <T, ID extends Serializable> JpaRepository<?, ?> getTargetRepository( RepositoryMetadata metadata, EntityManager entityManager) { Class<?> repositoryInterface = metadata.getRepositoryInterface(); JpaEntityInformation<?, Serializable> entityInformation = getEntityInformation(metadata .getDomainType()); @SuppressWarnings({ "unchecked", "rawtypes" }) SimpleJpaRepository<?, ?> repo = isQueryDslExecutor(repositoryInterface) ? new MyQueryDslJpaRepository( entityInformation, entityManager) : new MySimpleJpaRepository( entityInformation, entityManager); repo.setLockMetadataProvider(lockModePostProcessor .getLockMetadataProvider()); return repo; } protected Class<?> getRepositoryBaseClass(RepositoryMetadata metadata) { if (isQueryDslExecutor(metadata.getRepositoryInterface())) { return QueryDslJpaRepository.class; } else { return MySimpleJpaRepository.class; } } private boolean isQueryDslExecutor(Class<?> repositoryInterface) { return QUERY_DSL_PRESENT && MyQueryDslPredicateExecutor.class .isAssignableFrom(repositoryInterface); } }