gpt4 book ai didi

java - 使用 spring boot 存储 couchbase 的通用类型

转载 作者:行者123 更新时间:2023-12-04 15:28:57 29 4
gpt4 key购买 nike

我正在 Spring Boot 中创建一个实用程序,以更通用的方式将数据连接和插入/更新插入到 couchbase 中。

我有这样的事情:

public interface GenericRepository extends CouchbaseRepository<MyClass, String> {
}

我在哪里 MyClass我愿意接受 任何种类 要插入到 couchbase 中的文档。

我尝试了一些事情,比如使用泛型类型 T 但没有成功,因为我收到以下错误:

Caused by: org.springframework.data.mapping.MappingException: Couldn't find PersistentEntity for type class java.lang.Object!



我的结构是:service(interface/impl)>DAO(interface/impl)>repository

额外信息:在上述模型中,我传递了一个通用类型 T。我正在使用我的 Pojo 调用服务 @Document注解。

目标是消除为每种类型的文档拥有一个存储库类的“依赖性”。

最佳答案

您可以拥有通用存储库(有点 hacky),但有一些限制。假设你有文件;

@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 Mid1Mid1 extends Base )

关于java - 使用 spring boot 存储 couchbase 的通用类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58319769/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com