【发布时间】:2018-05-30 05:54:51
【问题描述】:
我有最简单的spring boot程序: 主要:
@SpringBootApplication
public class Application implements CommandLineRunner {
@Autowired
private AdapterFixRepository adapterFixRepository;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Transactional(readOnly = true)
@Override
public void run(String... args) {
System.out.println("Id 736: " + adapterFixRepository.getById(736L));
}
}
实体:
@Data
@Entity
public class AdapterFix {
@Id
@GeneratedValue
Long id;
private String senderCompId;
}
DAO:
public interface AdapterFixRepository extends CrudRepository<AdapterFix, Long> {
String SELECT_ADAPTER_FIX_BY_ID = " SELECT fix.*, adp.*, stm.* " +
" FROM `tr-dev`.adapter_fix AS fix " +
" INNER JOIN `tr-dev`.adapter AS adp ON fix.ID = adp.ID " +
" INNER JOIN `tr-dev`.stream_types AS stm ON stm.ID = fix.STREAM_TYPES_ID " +
" WHERE fix.ID = :id";
AdapterFix findById(@Param("id") Long id);
@Query(value = SELECT_ADAPTER_FIX_BY_ID, nativeQuery = true)
AdapterFix getById(@Param("id") Long id);
}
还有在 application.properties 中:
spring.datasource.url=jdbc:mysql://localhost:3306/tr-dev?autoReconnect=true
spring.datasource.username=root
spring.datasource.password=***
spring.datasource.driverClassName=com.mysql.jdbc.Driver
一切都很好。 然后我尝试添加另一个数据库。我删除了我的 application.properties,并添加了这个配置文件:
@Configuration
@Qualifier("second.spring.datasource")
public class DataSourceConfig {
@Primary
@Bean(name = "first.spring.datasource")
@ConfigurationProperties(prefix = "first.spring.datasource")
@Qualifier("first.spring.datasource")
public DataSource firstDataSource() {
return DataSourceBuilder.create().url("jdbc:mysql://localhost:3306/tr-dev?autoReconnect=true").username("root").password("***").
driverClassName("com.mysql.jdbc.Driver").build();
}
@Bean(name = "second.spring.datasource")
@Qualifier("second.spring.datasource")
@ConfigurationProperties(prefix = "second.spring.datasource")
public DataSource secondDataSource() {
return DataSourceBuilder.create().url("jdbc:mysql://10.2.5.63:3306/tr-dev?autoReconnect=true").username("root").password("***").
driverClassName("com.mysql.jdbc.Driver").build();
}
}
它是从我的第一个数据源中选择的。我尝试在周围添加 @Qualifier("second.spring.datasource") ,但没有帮助。我尝试在 DAO 的方法中添加限定符,但没有帮助。我尝试在主类、Autowired 和 run 方法中添加限定符 - 没有帮助。当我在 application.properties 上添加“second.spring.datasource”时,它也没有帮助。
我做错了什么?我还应该做什么?我可以看到访问多个 DB 的其他代码,但它们太复杂了,有许多 Bean 和其他休眠特定属性——而不是简单的 Spring Boot 定义。我必须转为休眠并使用许多 bean 和事务管理器吗?
【问题讨论】:
-
你使用 Spring Data JPA 吗?
-
是的,在 DAO 的 @Query 中。
-
您可以通过
@EnableJpaRepositories使用不同的配置来分配不同的数据源。最近有一个article 可能会对您有所帮助。 -
同样,这个解决方案包括许多 Bean、Hibernate 语句、LocalContainerEntityManagerFactoryBean、PlatformTransactionManager 等等。我的春季课非常基础。没有基本的方法可以做到这一点吗?听起来没那么难。
-
存储库不使用数据源,实体管理器使用。事务管理器使用实体管理器。所以你需要两组至少三种不同的豆子。这个例子是非常基础的。您可以简单地复制大部分配置。
标签: java spring spring-boot