Поддержка нескольких типов баз данных для сущности в SpringBoot - PullRequest
0 голосов
/ 04 ноября 2019

Team

Я создаю приложение с пружинной загрузкой, которое может поддерживать несколько БД Cassandra, CouchDB или DynamoDB на основе конфигурации в application.yml.

Мой класс сущности содержит аннотации, которыеспецифичны для Cassandra, а аннотации для DynamoDB разные. Например,У DynamoDB есть @DynamoDBTable для таблицы, а у Кассандры есть аннотации @ org.springframework.data.cassandra.core.mapping.Table.

Проблема в том, что я хотел бы использовать один объект сущности независимо от типа БД, потому чтосущность упоминается из нескольких мест в приложении. Каков наилучший шаблон проектирования для реализации этого?

Для Кассандры -

package com.abc;

@Table("Cart")
    public class Cart  {

        @PrimaryKeyColumn(ordinal = 0, type = PrimaryKeyType.PARTITIONED)
        @GeneratedValue(strategy = GenerationType.AUTO)
        protected String id;

        @PrimaryKeyColumn(ordinal = 1, type = PrimaryKeyType.PARTITIONED)
        private String userId;

        @PrimaryKeyColumn(ordinal = 2, type = PrimaryKeyType.CLUSTERED, ordering = Ordering.DESCENDING)
        private String skuId;

Для DynamoDB -

   @DynamoDBTable(tableName = "Cart")
    public class Cart  {

        @DynamoDBHashKey
        @DynamoDBAutoGeneratedKey
        protected String id;

        private String userId;

        private String skuId;

Спасибо АА

Ответы [ 2 ]

1 голос
/ 04 ноября 2019

Да, это возможно.

Вариант 1:

Просто введите необходимую аннотацию для MongoDB и Cassandra. У каждой аннотации будет свой пакет и определение. Поэтому предоставьте требуемое определение.

Вариант 2:

Как определено snk01, вы также можете использовать этот подход.

Здесь я предполагаю, что вы пишете постоянствослой для каждой базы данных отдельно.

1 голос
/ 04 ноября 2019

Я бы предложил вам создать промежуточный объект, который может служить мостом между логикой вашего приложения и базой данных ORM.

Вы можете создать вспомогательную функцию, которая заполняет эти поля.

class CartDAO  {

    private String id;
    private String userId;
    private String skuId;

    // Getters & Setters

}

class CartService{

    CartDAO fetchFromDynamoDB(String Id)
    {
        // Fetch from DB
        // Create CartDAO from that object
        // Return CartDAO
    }

    CartDAO fetchFromCassandra(String Id)
    {
        // Fetch from DB
        // Create CartDAO from that object
        // Return CartDAO
    }
}

Теперь вы можете беспрепятственно использовать CartDAO в логике своего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...