All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.spring.data.jpa.factory.JpaIdentifierUtil Maven / Gradle / Ivy

package com.moon.spring.data.jpa.factory;

import com.moon.core.lang.JoinerUtil;
import com.moon.data.exception.UnknownIdentifierTypeException;
import com.moon.data.identifier.IdentifierUtil;
import com.moon.spring.data.jpa.JpaRecord;
import org.springframework.data.jpa.repository.support.JpaEntityInformation;
import org.springframework.data.jpa.repository.support.JpaRepositoryImplementation;
import org.springframework.data.repository.core.RepositoryInformation;

import javax.persistence.EntityManager;
import java.io.Serializable;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import static com.moon.core.lang.ThrowUtil.noInstanceError;

/**
 * @author moonsky
 */
public final class JpaIdentifierUtil extends IdentifierUtil {

    private JpaIdentifierUtil() { noInstanceError(); }

    /**
     * 缓存两种类型键值队
     * 

* class : Class ==> repository builder Function *

* classname: String ==> repository implementation class */ private final static Map IDENTIFIER_TYPED_REPOSITORY_BUILDER_REGISTRY = new ConcurrentHashMap<>(); final static > T extractPresetPrimaryKey(T record) { return putRecordPresetPrimaryKey(record); } /** * 注册 * * @param identifierClass * @param repositoryBuilder */ public static void registerIdentifierTypedRepositoryBuilder( Class identifierClass, RepositoryBuilder repositoryBuilder, Class repositoryImplementationClass ) { IDENTIFIER_TYPED_REPOSITORY_BUILDER_REGISTRY.put(identifierClass, repositoryBuilder); IDENTIFIER_TYPED_REPOSITORY_BUILDER_REGISTRY.put(identifierClass.getName(), repositoryImplementationClass); } public static , T extends JpaRepositoryImplementation> Class getRepositoryImplementationClass( Class identifierClass, Class defaultIfAbsent ) { return (Class) IDENTIFIER_TYPED_REPOSITORY_BUILDER_REGISTRY.getOrDefault(identifierClass.getName(), defaultIfAbsent); } @SuppressWarnings("all") public static JpaRepositoryImplementation newTargetRepository( RepositoryInformation repositoryInformation, JpaEntityInformation entityInformation, EntityManager em, JpaRecordRepositoryMetadata metadata ) { Class identifierClass = repositoryInformation.getIdType(); IdentifierUtil.addUsedIdentifierType(identifierClass); Map registry = IDENTIFIER_TYPED_REPOSITORY_BUILDER_REGISTRY; try { return registry.getOrDefault(identifierClass, DefaultRepositoryImpl::new) .newRepository(repositoryInformation, entityInformation, em, metadata); } catch (NullPointerException e) { throw new UnknownIdentifierTypeException("未知主键类型: " + identifierClass +// ", 支持的类型有: \n\t" + JoinerUtil.join(registry.keySet(), "\n\t")); } } /** * 默认实现 * * @param 实体类型 */ final static class DefaultRepositoryImpl> extends AbstractRepositoryImpl { public DefaultRepositoryImpl( RepositoryInformation repositoryInformation, JpaEntityInformation ei, EntityManager em, JpaRecordRepositoryMetadata metadata ) { super(repositoryInformation, ei, em, metadata); } } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy