Вы можете иметь общие репозитории (немного хакерские), но с некоторыми ограничениями. Предположим, у вас есть документы;
@Document
public class MyClass1 extends BaseClass {
private String text1;
public MyClass1() {
super();
setType(Type.MyClass1);
}
// getter/setters
}
@Document
public class MyClass2 extends BaseClass {
private String text2;
public MyClass2() {
super();
setType(Type.MyClass2);
}
// getter/setters
}
с BaseClass
;
@Document
public class BaseClass {
private Type type;
// other common fields if any, and getter/setters
public enum Type {
MyClass1, MyClass2
}
}
Тогда вы можете иметь следующий репозиторий;
public interface GenericRepository<T extends BaseClass> extends CouchbaseRepository<T, String> {
public List<T> findByType(BaseData.Type type);
public default List<T> findAll(Class<T> clazz) throws IllegalAccessException, InstantiationException {
return findByType(clazz.newInstance().getType());
}
}
и использовать его как;
@Autowired
private GenericRepository<MyClass1> mc1Repository;
@Autowired
private GenericRepository<MyClass2> mc2Repository;
public void doStuff() {
MyClass1 myClass1 = new MyClass1();
myClass1.setText1("text1");
mc1Repository.save(myClass1);
mc1Repository.findAll(MyClass1.class).forEach(d -> System.out.println(d.getText1()));
MyClass2 myClass2 = new MyClass2();
myClass2.setText2("text2");
mc2Repository.save(myClass2);
mc2Repository.findAll(MyClass2.class).forEach(d -> System.out.println(d.getText2()));
}
распечатает;
text1
text2
Но имейте в виду, что все документы будут находиться в одной коллекции, которая является коллекцией для BaseClass
Такжеэто не будет работать с более чем одним расширением (например, MyClass1 extends Mid1
и Mid1 extends Base
)