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

Spring - dwa źródła danych, jpa i postgres + mongo
HO
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad rok
  • Postów:19
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

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

dalej repo postgresa

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

}

i repo mongo

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

}

wstrzykując repo postgresa do serwisu

Kopiuj
@Component
@AllArgsConstructor
class ReportsService {

    private final Reports reports;

// ...
}

dostaję

Kopiuj
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

Charles_Ray
  • Rejestracja:około 17 lat
  • Ostatnio:około 16 godzin
  • Postów:1875
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

”Engineering is easy. People are hard.” Bill Coughran
HO
  • Rejestracja:prawie 5 lat
  • Ostatnio:ponad rok
  • Postów:19
0

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

ZN
  • Rejestracja:około 6 lat
  • Ostatnio:około 2 lata
  • Postów:49
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:

Kopiuj
@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

edytowany 2x, ostatnio: ZabawnyNick

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.