Spring - dwa źródła danych, jpa i postgres + mongo

0

Hej, mam problem z korzystaniem z dwóch źródeł danych jednocześnie ze spring boot. Potrzebuję korzystać z mongo i postgres w obrębie jednej aplikacji.

w build.gradle mam

'org.springframework.boot:spring-boot-starter-data-jpa',
'org.springframework.boot:spring-boot-starter-data-mongodb',

dalej repo postgresa

@Repository
public interface Reports extends CrudRepository<Report, UUID> {

}

i repo mongo

@Repository
public interface Users extends MongoRepository<User, UUID> {

}

wstrzykując repo postgresa do serwisu

@Component
@AllArgsConstructor
class ReportsService {

    private final Reports reports;

// ...
}

dostaję

Parameter 0 of constructor in ReportsService required a bean of type 'Reports' that could not be found.
Consider defining a bean of type 'Reports' in your configuration.

czy jest jakiś sposób, aby bezkolizyjnie podpiąć się pod obydwa źródła danych?

z góry dzięki

2

Nigdy tego nie ćwiczyłem w ten sposób, ale domyślam się do jakich problemów (również z rozwojem i utrzymaniem) może to doprowadzić. W szczególności zaraz padnie pytanie jak zrobić, żeby @Transactional działało na kilku kolekcjach Mongo.

Ja bym zrobił tak:

  1. Rozbił to na 2 apki albo
  2. Do SQL użył JdbcTemplate albo
  3. Do Mongo użył jakiejś Morphia itp
0

dzięki, użycie jdbc było planem b, jednak chciałem być pewny, że nie ma opcji z jpa.

1

jest opcja użycia jpa, ale musiałbyś skonfigurować samodzielnie repozytoria, nie wiem jak transakcje dla mongo ale dla SQL w tym przypadku MySQL działają, dla przykładu:

@EnableTransactionManagement
@EnableJpaRepositories(basePackages = com.sample.myentities", entityManagerFactoryRef = "entityManager", transactionManagerRef = "transactionManager")
public class DataSourceConfiguration {

....
    @Bean(name = "entityManager")
    public EntityManagerFactory entityManagerFactoryMaster() {

....

    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManagerMaster() {

  ....
    
    @Bean(name = "chainedTransactionManager")
    @Primary
    public ChainedTransactionManager transactionManager(@Qualifier("transactionManager") PlatformTransactionManager ds1) {

....

Beany są trochę stare i jest tam persistence.xml, pewnie dało by się je lepiej napisać tak więc zostawiam już do własnej implementacji

jeżeli nie musisz to wybrałbym opcję która jest wyżej opisana przez Charles_Ray

1 użytkowników online, w tym zalogowanych: 0, gości: 1