java保持pojo数据存储独立

czq61nw1  于 2021-06-10  发布在  Cassandra
关注(0)|答案(1)|浏览(375)

我有一个微服务,目前使用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,它将是通用的,并且可以轻松地处理这两个数据存储?

5lwkijsr

5lwkijsr1#

一种方法是使用单个业务域和存储库域。存储时,执行从公共业务域到存储库域的转换。应用程序中的所有内容都使用业务域,因此交换数据存储应该相当简单。
此外,还可以使用伪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,因此您只需要一个服务实现)需要了解目标类型(例如。 MongoPerson , CassandraPerson ). 您需要某种实用程序类来处理转换。也许是这样的:

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。然后,您可以获取相关的Map器并转换:

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

我故意省略了更详细的细节,因为这是一个相当多的样板代码,但这应该可以让大家理解这个想法。基本上,您不需要为多个数据库使用一个类,因为这可能会很快变得混乱。考虑到您将来可能还需要添加sql数据库支持。我看不出这些注解配合得很好。
当然,根据您的实现,这也可能有些过分,但它是一个可扩展的通用解决方案。
然而,关键是你有一个 Person 一个pojo类。所有操作都在此类上执行。然后将其转换为特定于数据库提供程序的实体类,这就是实际持久化的实体类。这些实体类和dao或存储库具有业务领域的知识( Person ),但业务域不知道存储库域。

相关问题