파비오 카르도소 :
나는 가능한보다 일반적인 방식으로 카우치베이스 주식회사로 데이터 upsert / 연결 및 삽입 봄 부팅에 유틸리티를 만드는거야.
나는 이런 식으로 뭔가를 가지고 :
public interface GenericRepository extends CouchbaseRepository<MyClass, String> {
}
나는이 경우 MyClass
동의 함을하고자하는 모든 종류의 카우치베이스 주식회사에 삽입 할 문서를.
나는 일반 유형을 사용하여 같은 몇 가지를 시도 T하지만 성공없이 나는 다음과 같은 오류를 가지고 있기 때문에 :
org.springframework.data.mapping.MappingException :에 의한 유형 클래스 java.lang.Object 상위를위한 PersistentEntity을 찾을 수 없습니다!
내 구조는 다음과 같습니다 서비스 (인터페이스 / IMPL)> DAO (인터페이스 / IMPL)> 저장소
추가 정보 : 위의 모델에 걸쳐 나는 내 뽀조와 내가 서비스를 호출하고 제네릭 형식 T를 전달하고 @Document
주석.
목표는 문서의 각 유형에 대해 하나 개의 저장소 클래스를 가지고있는 "의존성"을 제거하는 것입니다.
buræquete :
당신은 일반적인 저장소 (비트 해키)하지만 일부 제한과를 가질 수 있습니다. 이 문서가 있다고 가정;
@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
)