自定义实现 Repository

自定义Repository 离不开 EntityManager

  • 通过 @PersistenceContext 标记在 EntityManager类型的字段上可以得到
  • 通过构造方法获得

 

单个接口特殊化实现方式(私有)

声明接口:

public interface MyRepository<T,ID extends Serializable> {
    
    // 逻辑删除
    void deleteR(ID id);
}

实现类:

public class MyRepositoryImpl<T,ID extends Serializable> implements MyRepository {

    // 获取 EntityManager 实例
    @PersistenceContext
    private EntityManager entityManager;


    @Override
    public void deleteR(Serializable serializable) {
        System.out.println("调用了删除");

    }
}

调用:

public interface UserRepository extends JpaSpecificationExecutor<SystemUser>, MyRepository<SystemUser,Long> {

}

 

通用场景自定义方式:

声明接口:

@NoRepositoryBean
public interface MyRepo<T,ID extends Serializable> extends JpaRepository<T,ID> {

    // 获取租户id
    void getTenantId();

}

实现接口:

public class MyRepoImpl<T,ID extends Serializable> extends SimpleJpaRepository<T,ID> implements MyRepo<T,ID>  {

    // 通过构造方法注入 EntityManager 实例
    private final EntityManager entityManager;

    public MyRepoImpl(JpaEntityInformation<T, ?> entityInformation, EntityManager entityManager) {
        super(entityInformation, entityManager);
        this.entityManager = entityManager;
    }

    public MyRepoImpl(Class<T> domainClass, EntityManager em) {
        super(domainClass, em);
        this.entityManager = em;
    }


    @Override
    public void getTenantId() {
        System.out.println("获取租户id");
    }
}

配置MyRepoImpl类为其他接口动态代理的实现基类:

@EnableJpaRepositories(repositoryBaseClass = MyRepoImpl.class)
@SpringBootApplication
public class StudySpringDataJpaApplication {

    public static void main(String[] args) {
        SpringApplication.run(StudySpringDataJpaApplication.class, args);
    }

}

调用:

public interface UserRepository extends MyRepository<SystemUser,Long> {

}

测试:

@Test
public void testEM(){
    this.userRepository.getTenantId();
}

 

posted @ 2020-11-21 17:30  半雨微凉  阅读(295)  评论(0)    收藏  举报