Не работает метод Save() в CrudRepository использую Java Spring Boot

Рейтинг: 1Ответов: 1Опубликовано: 27.04.2023

У меня есть 2 datasource и соответственно 2 конфиг класса

Первая база данных пусть будет myDb1, а вторая myDb2

Ниже конфиг класс для myDb1 (думаю понятно что второй класс будет точно такой же за исключением смамого названия бд)

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        basePackages = "com.example.myDb1.repository",
        entityManagerFactoryRef = "myDb1EntityManagerFactory",
        transactionManagerRef = "myDb1TransactionManager"
)
public class MyDb1JpaConfig {

    @Autowired
    private Environment env;

    @Bean(name = "myDb1DataSource")
    public DataSource myDb1DataSource(){
        HikariDataSource dataSource = new HikariDataSource();
        dataSource.setJdbcUrl(env.getProperty("spring.datasource.myDb1.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.myDb1.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.myDb1.password"));
        dataSource.setDriverClassName(env.getProperty("spring.datasource.myDb1.driver-class-name"));
        dataSource.setMaximumPoolSize(10);
        return dataSource;
    }

    @Bean(name = "myDb1EntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean myDb1EntityManagerFactory(
            EntityManagerFactoryBuilder builder,
            @Qualifier("myDb1DataSource") DataSource dataSource) {
        return builder
                .dataSource(dataSource)
                .packages("com.example.myDb1.entity")
                .persistenceUnit("myDb1")
                .build();
    }

    @Bean(name = "myDb1TransactionManager")
    public PlatformTransactionManager myDb1TransactionManager(
            @Qualifier("myDb1EntityManagerFactory") LocalContainerEntityManagerFactoryBean entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory.getNativeEntityManagerFactory());
    }
}

И есть репозиторий для бд myDb1, который соответсвенно храниться в package com.example.repository.myDb1.MyRepository

public interface MyRepositoryextends CrudRepository<User, Long> { User getUserById(Long id);

@Transactional
void deleteByUserId(Long userId);

}

И наконец сама конфигурация для все этог в конфиг файле application.yml

spring:
  datasource:
    myDb1:
      url: jdbc:mysql://localhost:3306/myDb1?zeroDateTimeBehavior=CONVERT_TO_NULL
      username: user1
      password: password1
      driver-class-name: com.mysql.cj.jdbc.Driver
    myDb2:
      url: jdbc:mysql://localhost:3306/myDb2?zeroDateTimeBehavior=CONVERT_TO_NULL
      username: user2
      password: password2
      driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
    hibernate:
      ddl-auto: update
      generate-ddl: true

Так вот. Почему-то метод save не работает, хотя метод getUserById работает прекрасно. Уверен дело в том что я что-то не так настроил где в классе конфиг, но я сопля в Spring Boot поэтому не могу понять что.

Хотелось бы найти ответ на этот вопрос, и если кто знает подскажите как лучше организовывать использование сразу нескольких DataSource и CrudRepository для работы с данными

Ответы

▲ 1

В общем ошибка была глупой, вместо entityManagerFactory.getNativeEntityManagerFactory() в бине myDb1TransactionManager нужно было использовать entityManagerFactory.getObject()