카우치베이스 주식회사에 대한 저장소에 일반 타입의 스프링 부팅을 사용하여

파비오 카르도소 :

나는 가능한보다 일반적인 방식으로 카우치베이스 주식회사로 데이터 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)

추천

출처http://43.154.161.224:23101/article/api/json?id=311955&siteId=1