gpt4 book ai didi

Java 保持 pojo 数据存储独立

转载 作者:行者123 更新时间:2023-12-02 09:10:28 25 4
gpt4 key购买 nike

我有一个微服务,当前使用 cassandra 进行持久化。

@Table(name = "persons")
public class Person {

@PartitionKey
@JsonProperty("personId")
private UUID personId;

@JsonProperty("personName")
private String personName;
}

我想开始使用 mongodb 进行持久化为此,该类需要如下所示

public class Person implements Serializable {

@JsonSerialize(using = ObjectIdSerializer.class)
private ObjectId personId;

@JsonProperty("personName")
private String personName;
}

我想知道是否有一种方法可以保持 pojo 数据存储独立,因此我应该如何创建一个通用且可以轻松与两个数据存储一起使用的 pojo?

最佳答案

实现此目的的一种方法是使用单个业务域和存储库域。存储时,进行普通业务域到存储库域的转换。应用程序内的所有内容都利用业务域,因此交换数据存储应该相当简单。

此外,还可以使用伪 ID,这样您就可以跨数据库提供程序共享“主”ID。

可以帮助实现这一点的库是 ModelMapper .

基本的,类似这样的东西。常见的业务领域:

public class Person implements Serializable {
String id;
...
}

Mongo 实现:

public class MongoPerson implements Mappable {

@JsonSerialize(using = ObjectIdSerializer.class)
private ObjectId personId;

// pseudo ID, generated and indexed. Optional
String id;

@Override
ModelMapper fromMe() {
ModelMapper mapper = new ModelMapper();
mapper.createTypeMap(MongoPerson.class, Person.class);
return mapper;
}
@Override
ModelMapper toMe() {
ModelMapper mapper = new ModelMapper();
mapper.createTypeMap(Person.class, MongoPerson.class);
return mapper;
}
Class<?> getBusinessDomain() {
return Person.class;
}
}

如果您想保持此解决方案的通用性,那么这里会有点复杂。您的服务或 DAO(最好是 DAO,因此您只需要一个服务实现)需要了解目标类型(例如 MongoPersonCassandraPerson )。您需要某种实用程序类来处理转换。也许是这样的:

class PersonService {
// This DAO is just an interface that targets either MongoPerson or CassandraPerson, so the implementation may be swapped out.
PersonDao<Mappable> repository;
MappableHelper helper;
Person save(Person person) {
Mappable mappable = repository.save(helper.convertToDomain(person, repository));
return helper.convertFromDomain(mappable);
}
}

在您的 PersonRepository 中,您将有一个通用方法 Class<?> getRepositoryDomain()这将返回所需的存储库类,无论是 Mongo、Jpa 还是 Cassandra。然后,您可以获取相关的映射器并进行转换:

Mappable persistenceDomain = personRepository.getRepositoryDomain().newInstance();
return persistenceDomain.toMe().map(person, persistenceDomain);

我故意省略了更详细的细节,因为它是相当多的样板代码,但这应该可以传达这个想法。本质上,您不会对多个数据库使用单个类,因为这可能会很快变得困惑。考虑一下您将来可能还想添加 SQL 数据库支持。我看不出这些注释能很好地结合在一起。

当然,根据您的实现,这也可能有些过大,但它是一个可扩展的通用解决方案。

然而,重点是你有一个 Person类是 POJO。所有的操作都是在这个类上进行的。然后,您将其转换为特定于数据库提供程序的实体类,这就是实际保留的内容。这些实体类和 daos 或存储库了解业务领域 ( Person ),但业务领域不了解存储库领域。

关于Java 保持 pojo 数据存储独立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59462084/

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