0

스프링 데이터 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()으로 전화를 걸면 비어있는 목록이 표시됩니다.

+0

BoardRateRepository가 작동하고 있습니까? 이 설정이 어떻게 작동하는지 궁금합니다.이 경우 프레임 워크가 어떤 EntityManager, TransactionManager, Datasource를 어떤 저장소에 사용할지를 알고 있기 때문입니다. 왜냐하면'EnableJpaRepositories'에서'basePackage'를 jave하지 않기 때문입니다. 모든 저장소에 대해 Primary EntityManager, TransactionManager 및 Datasource를 사용합니다. – pvpkiran

+0

리포지토리가 정상적으로 작동하고 있습니다. 여기에 패키지 세부 정보가 포함되지 않았으므로 여기에 붙여 넣은 코드가 작동하지 않는다는 인상을 줄 수 있습니다. 사과! –

답변

0

위의 코드에 패키지 세부 정보가 포함되어 있지 않지만 리포지토리가 다른 패키지에 있으므로 위 코드가 정상적으로 작동합니다.

또한이 문제는 이유가 가장 부끄럽기 때문에 발생했습니다. 이 문제를 일으킨 각 데이터 소스마다 다른 환경을 가리키고있었습니다. 나는 바른 환경에 그것을 지적했고, 모든 일하고있다!!

감사합니다.