I have tried to research on a better way of calling two stored procedures on two different data sources with no luck. Here is my scenario, I have connection to two data sources, each data source with a stored procedure. whenever I annotate one configuration as primary I get the results, the other configuration which is not mapped as primary throws an error
The given SqlResultSetMapping name [Unknown SqlResultSetMapping [Testing]] is unknown
When I set the other configuration for the class calling the stored procedure as primary, It shows results, but when both of them are not set as primary they throw an error
The given SqlResultSetMapping name [Unknown SqlResultSetMapping [Testing]] is unknown
Been stuck for several days. I will appreciate any help.Thank you in advance
my first config for calling the first data source
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "guru.springframework.multipledatasources.model.Card",
entityManagerFactoryRef = "cardEntityManagerFactory",
transactionManagerRef= "cardTransactionManager")
public class Cardonfiguration {
@Bean
@Primary
@ConfigurationProperties("datasource.card")
public DataSourceProperties cardDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("datasource.card.configuration")
public DataSource cardDataSource() {
return cardDataSourceProperties().initializeDataSourceBuilder()
.type(BasicDataSource.class).build();
}
@Primary
@Bean(name = "cardEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean cardEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(cardDataSource())
.packages(Card.class)
.build();
}
@Primary
@Bean
public PlatformTransactionManager cardTransactionManager(
final @Qualifier("cardEntityManagerFactory") LocalContainerEntityManagerFactoryBean cardEntityManagerFactory) {
return new JpaTransactionManager(Objects.requireNonNull(cardEntityManagerFactory.getObject()));
}
}
my second config for the second data source
@Configuration
@EnableJpaRepositories(basePackages = "guru.springframework.multipledatasources.model.member",
entityManagerFactoryRef = "memberEntityManagerFactory",
transactionManagerRef= "memberTransactionManager")
public class MemberConfiguration {
@Bean
@ConfigurationProperties("datasource.member")
public DataSourceProperties zamphiaDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("datasource.member.configuration")
public DataSource memberDataSource() {
return memberDataSourceProperties().initializeDataSourceBuilder()
.type(BasicDataSource.class).build();
}
@Bean(name = "memberEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean memberEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(memberDataSource())
.packages(member.class)
.build();
}
@Bean
public PlatformTransactionManager memberTransactionManager(
final @Qualifier("memberEntityManagerFactory") LocalContainerEntityManagerFactoryBean memberEntityManagerFactory) {
return new JpaTransactionManager(memberEntityManagerFactory.getObject());
}
}
my controller for the first data source
@RequestMapping("/api/v1")
@RestController
public class CardReports {
@PersistenceContext
private EntityManager entityManager;
@SuppressWarnings("unchecked")
@RequestMapping("/reports/CARD/dailyreport")
public List<Testing> getDailyAchievements(){
List<Testing> list;
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("dailyreports", "Testing");
try {
// Execute query
query.execute();
list = query.getResultList();
} finally {
try {
query.unwrap(ProcedureOutputs.class).release();
} catch (Exception e) {
}
}
return list;
}
}
my non entity for the first data source
@MappedSuperclass
@SqlResultSetMapping(name = "Testing", classes = @ConstructorResult(targetClass = Testing.class, columns = {
@ColumnResult(name = "TTEAM_ID", type = Integer.class),
@ColumnResult(name = "VDATE", type = String.class),
@ColumnResult(name="Days_in_Field", type = String.class),
@ColumnResult(name= "Expected_cummilative_Number_of_HH", type = String.class),
@ColumnResult(name="Cummlative_HH_Reached", type = String.class),
@ColumnResult(name="HH_Reached_for_day", type = String.class),
@ColumnResult(name ="HHs_Finalised_for_day", type = String.class),
@ColumnResult(name="Number_of_HH_in_process_for_day", type = String.class),
@ColumnResult(name="Number_of_HH_Refused_for_day", type = String.class),
@ColumnResult(name="Number_of_Revisits_Scheduled_for_day", type = String.class),
@ColumnResult(name="HH_loss_3rd_visit_attempt_refusals_for_day", type = String.class)
}))
public class Testing {
private Integer TTEAM_ID;
private String VDATE;
private String Days_in_Field;
private String Expected_cummilative_Number_of_HH;
private String Cummlative_HH_Reached;
private String HH_Reached_for_day;
private String HHs_Finalised_for_day;
private String Number_of_HH_in_process_for_day;
private String Number_of_HH_Refused_for_day;
private String Number_of_Revisits_Scheduled_for_day;
private String HH_loss_3rd_visit_attempt_refusals_for_day;
public Testing(Integer TTEAM_ID, String VDATE, String Days_in_Field, String Expected_cummilative_Number_of_HH, String Cummlative_HH_Reached, String HH_Reached_for_day, String HHs_Finalised_for_day, String Number_of_HH_in_process_for_day, String Number_of_HH_Refused_for_day, String Number_of_Revisits_Scheduled_for_day, String HH_loss_3rd_visit_attempt_refusals_for_day) {
this.TTEAM_ID = TTEAM_ID;
this.VDATE = VDATE;
this.Days_in_Field = Days_in_Field;
this.Expected_cummilative_Number_of_HH = Expected_cummilative_Number_of_HH;
this.Cummlative_HH_Reached = Cummlative_HH_Reached;
this.HH_Reached_for_day = HH_Reached_for_day;
this.HHs_Finalised_for_day = HHs_Finalised_for_day;
this.Number_of_HH_in_process_for_day= Number_of_HH_in_process_for_day;
this.Number_of_HH_Refused_for_day = Number_of_HH_Refused_for_day;
this.Number_of_Revisits_Scheduled_for_day = Number_of_Revisits_Scheduled_for_day;
this.HH_loss_3rd_visit_attempt_refusals_for_day = HH_loss_3rd_visit_attempt_refusals_for_day;
}
//getters and setters
my second data source controller
@RequestMapping("/api/v1")
@RestController
public class MemberDaily {
@PersistenceContext
private EntityManager entityManager;
@SuppressWarnings("unchecked")
@RequestMapping("/reports/member/dailyachievementreport")
public List<DailyReport> getDailyAchievements(){
List list;
StoredProcedureQuery query = entityManager.createStoredProcedureQuery("dailyreports", "Testing");
try {
// Execute query
query.execute();
list = query.getResultList();
} finally {
try {
query.unwrap(ProcedureOutputs.class).release();
} catch (Exception e) {
}
}
return list;
}
}
how I am mapping results on my pojo for my second data source
@MappedSuperclass
@SqlResultSetMapping(name = "Testing", classes = @ConstructorResult(targetClass = Testing.class, columns = {
@ColumnResult(name = "TTEAM_ID", type = Integer.class),
@ColumnResult(name = "VDATE", type = String.class),
@ColumnResult(name="Days_in_Field", type = String.class),
@ColumnResult(name= "Expected_cummilative_Number_of_HH", type = String.class),
@ColumnResult(name="Cummlative_HH_Reached", type = String.class),
@ColumnResult(name="HH_Reached_for_day", type = String.class),
@ColumnResult(name ="HHs_Finalised_for_day", type = String.class),
@ColumnResult(name="Number_of_HH_in_process_for_day", type = String.class),
@ColumnResult(name="Number_of_HH_Refused_for_day", type = String.class),
@ColumnResult(name="Number_of_Revisits_Scheduled_for_day", type = String.class),
@ColumnResult(name="HH_loss_3rd_visit_attempt_refusals_for_day", type = String.class)
}))
public class Testing {
private Integer TTEAM_ID;
private String VDATE;
private String Days_in_Field;
private String Expected_cummilative_Number_of_HH;
private String Cummlative_HH_Reached;
private String HH_Reached_for_day;
private String HHs_Finalised_for_day;
private String Number_of_HH_in_process_for_day;
private String Number_of_HH_Refused_for_day;
private String Number_of_Revisits_Scheduled_for_day;
private String HH_loss_3rd_visit_attempt_refusals_for_day;
public Testing(Integer TTEAM_ID, String VDATE, String Days_in_Field, String Expected_cummilative_Number_of_HH, String Cummlative_HH_Reached, String HH_Reached_for_day, String HHs_Finalised_for_day, String Number_of_HH_in_process_for_day, String Number_of_HH_Refused_for_day, String Number_of_Revisits_Scheduled_for_day, String HH_loss_3rd_visit_attempt_refusals_for_day) {
this.TTEAM_ID = TTEAM_ID;
this.VDATE = VDATE;
this.Days_in_Field = Days_in_Field;
this.Expected_cummilative_Number_of_HH = Expected_cummilative_Number_of_HH;
this.Cummlative_HH_Reached = Cummlative_HH_Reached;
this.HH_Reached_for_day = HH_Reached_for_day;
this.HHs_Finalised_for_day = HHs_Finalised_for_day;
this.Number_of_HH_in_process_for_day= Number_of_HH_in_process_for_day;
this.Number_of_HH_Refused_for_day = Number_of_HH_Refused_for_day;
this.Number_of_Revisits_Scheduled_for_day = Number_of_Revisits_Scheduled_for_day;
this.HH_loss_3rd_visit_attempt_refusals_for_day = HH_loss_3rd_visit_attempt_refusals_for_day;
}
//getters and setters
Your cardEntityManagerFactory
will scan the package of Card.class
for classes annotated with @ManagedSuperClass
and memberEntityManagerFactory
will scan the package of member.class
It looks like you are using the same POJO with SQLResultSetMapping
"Testing" in both the controllers. But it is not clear in which package this POJO is. So make sure the package of your POJO is scanned by both the entity managers.
Also, You are simply auto wiring the entity manager without specifying name in both the controllers. As per my understanding, only the Primary entity manager will be autowired in both the controllers if you don't specify a Qualifier
.
I think, you can try with @PersistenceContext(name = "cardEntityManagerFactory")
and @PersistenceContext(name = "memberEntityManagerFactory")
in the CardReports
and MemberDaily
controllers respectively.
Update
I had a look at your GitHub code and found that your BAISVReports
controller was getting the primary entity manager only. So just autowired the entitymanager using @Qualifier
as shown below and now the secondary entity manager is getting autowired. Now both controllers are able to find the SQLResultSetMapping
@RequestMapping("/api/v1")
@RestController
public class BAISVReports {
@Autowired
@Qualifier("baisvEntityManagerFactory")
private EntityManager entityManager;
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加