我有一个微服务,目前使用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,它将是通用的,并且可以轻松地处理这两个数据存储?
1条答案
按热度按时间5lwkijsr1#
一种方法是使用单个业务域和存储库域。存储时,执行从公共业务域到存储库域的转换。应用程序中的所有内容都使用业务域,因此交换数据存储应该相当简单。
此外,还可以使用伪id,这样就可以跨数据库提供程序共享“主”id。
modelmapper是一个可以帮助实现这一点的库。
基本的,像这样的。常见的业务领域:
mongo实现:
如果您想保持此解决方案的通用性,这里会有更复杂的问题。您的服务或dao(最好是dao,因此您只需要一个服务实现)需要了解目标类型(例如。
MongoPerson
,CassandraPerson
). 您需要某种实用程序类来处理转换。也许是这样的:在你的
PersonRepository
,你会有一个泛型方法,Class<?> getRepositoryDomain()
这将返回所需的存储库类,可以是mongo、jpa或cassandra。然后,您可以获取相关的Map器并转换:我故意省略了更详细的细节,因为这是一个相当多的样板代码,但这应该可以让大家理解这个想法。基本上,您不需要为多个数据库使用一个类,因为这可能会很快变得混乱。考虑到您将来可能还需要添加sql数据库支持。我看不出这些注解配合得很好。
当然,根据您的实现,这也可能有些过分,但它是一个可扩展的通用解决方案。
然而,关键是你有一个
Person
一个pojo类。所有操作都在此类上执行。然后将其转换为特定于数据库提供程序的实体类,这就是实际持久化的实体类。这些实体类和dao或存储库具有业务领域的知识(Person
),但业务域不知道存储库域。