Spring Data(JPA)多个存储库没有很多类

时间:2016-02-04 12:53:37

标签: java spring jpa spring-data spring-data-jpa

在我目前的项目中,我正在使用Spring Data JPA,并且我有超过20个@Entity类。

我想为它们创建存储库,但是使用@Repository注释为任何模型创建另一个类似乎是某种过度杀伤和大量“重复”代码 - 所有存储库类看起来都像:

@Repository
public interface SomeModelRepository extends CrudRepository<SomeModel, Long> {
}

有什么办法可以“自动”创建这些存储库吗?并且仅指定我将使用自己的方法扩展的那些?怎么应该以DRY和KISS方式完成?

3 个答案:

答案 0 :(得分:2)

正如上面评论中所提到的(问题) - 没有,我必须为我需要的每个实体创建存储库。还值得考虑aggregate roots(如果不直接查询某些实体)。

答案 1 :(得分:0)

当我使用具有大约100多个实体的数据源时,我使用以下方法,以便不为每个实体创建存储库。 我主要工作是仅将信息从源保存到我们的数据库。但是,也有一些想法如何也可以检索数据。

创建@MappedSuperclass的主要思想:

@MappedSuperclass
public abstract class SuperClass {

    @Id
    @GeneratedValue
    private Integer id;

    public SuperClass() {
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

然后扩展所有其他实体:

@Entity
public class Class1 extends SuperClass {

    private String classInfo;

    public String getClassInfo() {
        return classInfo;
    }

    public void setClassInfo(String classInfo) {
        this.classInfo = classInfo;
    }

    @Override
    public String toString() {
        return "\nClass1{" +
                "classInfo='" + classInfo + '\'' +
                '}';
    }
}

@Entity
public class Class2 extends SuperClass {

    private String classInfo;

    public String getClassInfo() {
        return classInfo;
    }

    public void setClassInfo(String classInfo) {
        this.classInfo = classInfo;
    }

    @Override
    public String toString() {
        return "\nClass2{" +
                "classInfo='" + classInfo + '\'' +
                '}';
    }
}

在这种情况下,您的存储库将是:

public interface SuperRepository extends JpaRepository<SuperClass, Integer> {

}

您可以应用它:

    Class1 class1 = new Class1();
    class1.setClassInfo("Class1 info");

    Class2 class2 = new Class2();
    class2.setClassInfo("Class2 info");

    superRepository.save(class1);
    superRepository.save(class2);

    //OR 
    //List<SuperClass> entities = Arrays.asList(class1,class2);
    //superRepository.saveAll(entities);

Hibernate将创建 Class1 Class2 表,并用数据填充它们。

下一步-如何检索数据。 我会考虑使用这种方法-在该存储库中为每个类创建查询:

public interface SuperRepository extends JpaRepository<SuperClass, Integer> {

    @Query("select c from Class1 c")
    List<Class1> findAllClass1();

    @Query("select c from Class2 c")
    List<Class2> findAllClass2();

}

然后,当您应用此功能时:

    System.out.println(superRepository.findAllClass1());
    System.out.println(superRepository.findAllClass2());

您将获得:

  

[Class1 {classInfo ='Class1 info'}]

     

[Class2 {classInfo ='Class2 info'}]

答案 2 :(得分:0)

对于那些来这里的人来说,他们正在寻找避免太多存储库接口文件的方法。从5.0开始,Spring中有一个叫做“可组合存储库”的东西,并且有很多示例代码可用,因此在这里不再赘述。 我发现了一种避免过多文件的类似方法,如下所示: 创建一个普通类,成为所有这些空存储库接口的提供者。将@Repository接口定义为包含类的非公共接口,并为每个存储库编写getter。下面的示例:

Public MyRepositoryProvider {

  @Autowired 
  Class1Repository class1Repo;
  public Class1Repository getClass1Repo() {
      return class1Repo;

  //.... similarly for Class2Repo

}

@Repository
interface Class1Repository extends CRUDRepository<Class1, Long>{}
@Repository
interface Class2Repository extends CRUDRepository<Class2, Long>{}

将所有这些都放在单个Java文件中。并确保其在您的项目的存储库扫描路径中。