У меня есть пользовательский объект, который я хочу сохранить в двух базах данных, одну в 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-rx.
Spring Data Neo4j RX (github.com/neo4j/sdn-rx — репозиторий заархивирован) заменен на Spring Data Neo4j 6 ( github.com/spring-projects/spring-data-neo4j). Вы должны обновить.
Давным-давно существовала некоторая поддержка такого сценария (примерно в Spring Data Neo4j 3), но кажется, что его очень сложно правильно поддерживать, поэтому больше нет встроенной поддержки частичных сущностей.
Например, как откатить транзакцию, если часть объекта правильно сохранена (в хранилище данных A), а другая — нет (в хранилище данных B)? Что делать, если откат не удался?
Если вы все еще хотите пойти по этому пути, я думаю, вам нужно явно использовать Neo4jTransactionManager
и MongoTransactionManager
(или их реактивные варианты) и полагаться на JTA или подобное для координации отдельных транзакций.
Для ваших сущностей я бы предположил, что может сработать отказ от аннотаций Spring Data Commons и использование аннотаций, специфичных для хранилища данных.
Есть ли в ваших зависимостях spring-data-neo4j?