Как я могу сопоставить одну сущность с двумя базами данных (MongoDb и Neo4j) с настраиваемыми свойствами в каждой

У меня есть пользовательский объект, который я хочу сохранить в двух базах данных, одну в MongoDb и одну в Neo4j:

@Node("User")
@Document
public class User {
  @Id
  @GeneratedValue(UUIDStringGenerator.class)
  @org.springframework.data.annotation.Id
  private String id;
  //some other fields
  private Set<SomeObject> objects = new HashSet<>();
  //getters and setters
}

Это мои зависимости для обеих баз данных:

        <dependency>
            <groupId>org.neo4j.springframework.data</groupId>
            <artifactId>spring-data-neo4j-rx-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>

Теперь представьте, что я хочу, чтобы набор объектов был сохранен в моем MongoDb, но не в моей базе данных Neo4j. Если я отмечу это как @Transient, оно не будет сохранено ни в одном из них. Есть какой-либо способ сделать это?

Есть ли в ваших зависимостях spring-data-neo4j?

fbiville 14.12.2020 09:37

Нет. Есть только spring-data-neo4j-rx.

Nora Na 14.12.2020 11:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Давным-давно существовала некоторая поддержка такого сценария (примерно в Spring Data Neo4j 3), но кажется, что его очень сложно правильно поддерживать, поэтому больше нет встроенной поддержки частичных сущностей.

Например, как откатить транзакцию, если часть объекта правильно сохранена (в хранилище данных A), а другая — нет (в хранилище данных B)? Что делать, если откат не удался?

Если вы все еще хотите пойти по этому пути, я думаю, вам нужно явно использовать Neo4jTransactionManager и MongoTransactionManager (или их реактивные варианты) и полагаться на JTA или подобное для координации отдельных транзакций.

Для ваших сущностей я бы предположил, что может сработать отказ от аннотаций Spring Data Commons и использование аннотаций, специфичных для хранилища данных.

Другие вопросы по теме