在我目前的项目中,我正在使用Spring Data JPA,并且我有超过20个@Entity
类。
我想为它们创建存储库,但是使用@Repository
注释为任何模型创建另一个类似乎是某种过度杀伤和大量“重复”代码 - 所有存储库类看起来都像:
@Repository
public interface SomeModelRepository extends CrudRepository<SomeModel, Long> {
}
有什么办法可以“自动”创建这些存储库吗?并且仅指定我将使用自己的方法扩展的那些?怎么应该以DRY和KISS方式完成?
答案 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文件中。并确保其在您的项目的存储库扫描路径中。