스프링 데이터 JPA를 사용하고 있으며 데이터를 가져 오기 위해 3 개의 엔티티와 2 개의 데이터 소스가 있습니다. 하나의 엔티티가 하나의 데이터 소스에 연결하고 JPA 저장소를 통해 데이터를 올바르게 가져옵니다. 문제는 2 번째 엔티티에 있습니다. 나머지 두 엔티티는 각 엔티티에 대해 별도의 JPA 저장소를 통해 1 개의 데이터 소스에 연결되지만 여기서는 하나의 엔티티 만 작동하고 다른 엔티티는 작동하지 않습니다.스프링 데이터 JPA 저장소가 다중 데이터 소스에서 데이터를 가져 오지 않습니다.
두 번째 엔티티에서 데이터를 가져 오는 동안 생성 된 SQL을 보여 주며 다른 오류 및 결과는 표시되지 않습니다. 내가 누락 된 것이 있습니까?
내 구성 파일 :
@Configuration
@EnableJpaRepositories(entityManagerFactoryRef = "orderEntityManagerFactory",
transactionManagerRef = "orderTransactionManager")
public class OrderConfig {
@Value("${spring.datasource.driver-class-name}")
private String driverClass;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password-key}")
private String passwordKey;
@Value("${spring.datasource.password-encrypted}")
private String passwordEncrypted;
@Bean
PlatformTransactionManager orderTransactionManager() {
return new JpaTransactionManager(orderEntityManagerFactory().getObject());
}
@Primary
@PersistenceContext(unitName = "first")
@Bean(name = "orderEntityManagerFactory")
LocalContainerEntityManagerFactoryBean orderEntityManagerFactory() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(orderDataSource());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setPackagesToScan(OrderConfig.class.getPackage().getName());
return factoryBean;
}
@Bean(name = "orderDataSource")
@Primary
public DataSource orderDataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setMaximumPoolSize(2);
dataSource.setPassword(AESCryption.decrypt(passwordKey, passwordEncrypted));
return dataSource;
}
또 다른 구성 파일 :
public class BoardRateConfig {
@Value("${spring.datasource.driver-class-name-oracle}")
private String driverClass;
@Value("${spring.datasource.url-oracle}")
private String url;
@Value("${spring.datasource.username-oracle}")
private String username;
@Value("${spring.datasource.password-key-oracle}")
private String passwordKey;
@Value("${spring.datasource.password-encrypted-oracle}")
private String passwordEncrypted;
@Bean
PlatformTransactionManager boardRateTransactionManager() {
return new JpaTransactionManager(boardRateEntityManagerFactory().getObject());
}
@PersistenceContext(unitName = "second")
@Bean(name = "boardRateEntityManagerFactory")
LocalContainerEntityManagerFactoryBean boardRateEntityManagerFactory() {
HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter();
jpaVendorAdapter.setGenerateDdl(true);
jpaVendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factoryBean = new LocalContainerEntityManagerFactoryBean();
factoryBean.setDataSource(boardRateDataSource());
factoryBean.setJpaVendorAdapter(jpaVendorAdapter);
factoryBean.setPackagesToScan(BoardRateConfig.class.getPackage().getName());
return factoryBean;
}
@Bean(name = "boardRateDataSource")
public DataSource boardRateDataSource() {
HikariDataSource dataSource = new HikariDataSource();
dataSource.setDriverClassName(driverClass);
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setMaximumPoolSize(2);
dataSource.setPassword(AESCryption.decrypt(passwordKey, passwordEncrypted));
return dataSource;
}
내 엔티티 :
@Getter
@Setter
@ToString
@EqualsAndHashCode(of = {"orderId"})
@Entity
@Table(name = "customer_order", uniqueConstraints = { @UniqueConstraint(columnNames = { "transaction_id", "region" }) })
@Data
public class Order {
@Id
@GeneratedValue
@Column(name = "order_id", columnDefinition="Unique Identifier of the Order")
private Long orderId;
@Column(name = "source_system")
private String sourceSystem;
@NotNull
@Column(name = "region", nullable = false)
@Enumerated(EnumType.STRING)
private Region region;
@NotNull
@Column(name = "transaction_id", nullable = false)
private String transactionId;
@NotNull
@Column(name = "dealt_currency", nullable = false)
private String dealtCurrency;
@NotNull
@Column(name = "currency_pair", nullable = false)
private String currencyPair;
@Column(name = "dealth_amount", nullable = false)
private BigDecimal dealtAmount;
@NotNull
@Column(name = "expected_rate", nullable = false)
private BigDecimal expectedRate;
@Column(name = "matched_rate", nullable = false)
private BigDecimal matchedRate;
@NotNull
@Column(name = "request_type", nullable = false)
@Enumerated(EnumType.STRING)
private RequestType requestType;
@NotNull
@Column(name = "status", nullable = false)
@Enumerated(EnumType.STRING)
private Status status;
@GridColumn(caption="Expiry Date (SGT)")
@Column(name = "expiry_date")
private LocalDateTime expiryDate;
@GridColumn(caption="Created Date (SGT)")
@Column(name = "created_date")
private LocalDateTime createdDate;
@GridColumn(caption="Matched Date Time (SGT)")
@Column(name = "matched_date_time")
private LocalDateTime matchedDateTime;
@GridColumn(caption="Updated Date (SGT)")
@Column(name = "updated_date")
private LocalDateTime updatedDate;
@GridColumn(caption="Expired Date Time (SGT)")
@Column(name = "expired_date_time")
private LocalDateTime expiredDateTime;
@Column(name = "price_tier")
private String priceTier;
@NotNull
@Column(name = "price_tier_currency", nullable = false)
private String priceTierCurrency;
@Version
private Integer version;
@Size(max = 1)
@Column(name = "service_type")
private String serviceType;
public static enum Status {
PENDING, MATCHED, EXPIRED, DELETED, NOTIFIED, ACKNOWLEDGED;
}
public static String getStatusValue(Status value){
if(value == Status.ACKNOWLEDGED)
return "ACKNOWLEDGED";
if(value == Status.MATCHED)
return "MATCHED";
if(value == Status.EXPIRED)
return "EXPIRED";
if(value == Status.DELETED)
return "DELETED";
if(value == Status.NOTIFIED)
return "NOTIFIED";
if(value == Status.PENDING)
return "PENDING";
return null;
}
public static Stream<Status> statusStream(){
return Arrays.stream(Status.values());
}
public static enum RequestType {
BUY, SELL;
}
public static String getRequestTypeValue(RequestType value){
if(value.equals(RequestType.BUY)){
return "BUY";
} else {
return "SELL";
}
}
}
@Getter
@Setter
@ToString
@EqualsAndHashCode(of = "orderId")
@Entity
@Table(name = "orders_match_at_board_rate_timestamp", uniqueConstraints = { @UniqueConstraint(columnNames = { "board_rate_timestamp", "order_id" }) })
public class BoardRateTimeStamp {
@Id
@GeneratedValue
@Column(name = "id", nullable = false)
private Long id;
@Column(name = "board_rate_timestamp", nullable = false)
private LocalDateTime boardRateTimestamp;
@Column(name = "order_id", columnDefinition="Unique Identifier of the Order")
private Long orderId;
}
,210
저장소 : 여기
public interface BoardRateTimeStampRepository extends JpaRepository<BoardRateTimeStamp, Long> {
@Query("SELECT brt FROM BoardRateTimeStamp brt WHERE brt.orderId IS NOT NULL AND brt.boardRateTimestamp >= :fromDate AND brt.boardRateTimestamp <= :toDate ")
List<BoardRateTimeStamp> findMatchedOrdersBoardRateTimeStampListBetweenDateRange(@Param("fromDate") LocalDateTime fromDate, @Param("toDate") LocalDateTime toDate);
}
public interface OrderRepository extends JpaRepository<Order, Long> {
@Query("SELECT o FROM Order o WHERE o.createdDate >= :fromDate AND o.createdDate <= :toDate")
public List<Order> findOrderBetweenDateRangeForCreatedDate(@Param("fromDate") LocalDateTime fromDate, @Param("toDate") LocalDateTime toDate);
@Query("SELECT o FROM Order o WHERE o.createdDate >= :fromDate AND o.createdDate <= :toDate AND o.status IN (:status)")
public List<Order> findOrderBetweenDateRangeForStatusForCreatedDate(@Param("fromDate") LocalDateTime fromDate, @Param("toDate") LocalDateTime toDate, @Param("status") EnumSet<Order.Status> status);
@Query("SELECT o FROM Order o WHERE o.updatedDate >= :fromDate AND o.updatedDate <= :toDate")
public List<Order> findOrderBetweenDateRangeForUpdatedDate(@Param("fromDate") LocalDateTime fromDate, @Param("toDate") LocalDateTime toDate);
@Query("SELECT o FROM Order o WHERE o.updatedDate >= :fromDate AND o.updatedDate <= :toDate AND o.status IN (:status)")
public List<Order> findOrderBetweenDateRangeForStatusForUpdatedDate(@Param("fromDate") LocalDateTime fromDate, @Param("toDate") LocalDateTime toDate, @Param("status") EnumSet<Order.Status> status);
@Query("SELECT o FROM Order o WHERE o.createdDate >= :date")
public List<Order> findOrdersCreatedToday(@Param("date") LocalDateTime date);
@Query("SELECT o FROM Order o WHERE o.updatedDate >= :date")
public List<Order> findOrdersUpdatedToday(@Param("date") LocalDateTime date);
@Query("SELECT o FROM Order o WHERE o.status = 'PENDING' ORDER BY o.currencyPair, o.priceTier ")
public List<Order> findAllPendingOrders();
public interface BoardRateRepository extends JpaRepository<BoardRate, BigInteger> {
@Query("SELECT br FROM BoardRate br WHERE br.rateTypeId = 2 ORDER BY br.baseCurrency || br.quoteCurrency, br.regionTierId")
public List<BoardRate> findLatestBoardRates();
}
는 BoardRateRepository 및 OrderRepository 잘 작동하지만 BoardRateTimeStampRepository가 작동하지 않습니다.
boardRateTimeStampRepository.findAll()
으로 전화를 걸면 비어있는 목록이 표시됩니다.
BoardRateRepository가 작동하고 있습니까? 이 설정이 어떻게 작동하는지 궁금합니다.이 경우 프레임 워크가 어떤 EntityManager, TransactionManager, Datasource를 어떤 저장소에 사용할지를 알고 있기 때문입니다. 왜냐하면'EnableJpaRepositories'에서'basePackage'를 jave하지 않기 때문입니다. 모든 저장소에 대해 Primary EntityManager, TransactionManager 및 Datasource를 사용합니다. – pvpkiran
리포지토리가 정상적으로 작동하고 있습니다. 여기에 패키지 세부 정보가 포함되지 않았으므로 여기에 붙여 넣은 코드가 작동하지 않는다는 인상을 줄 수 있습니다. 사과! –