Использование двух JNDI в Spring Boot с JPA и менеджером сущностей - PullRequest
0 голосов
/ 14 марта 2019

У меня есть приложение, которое отлично работает с одним JNDI, но теперь мне нужно добавить второе только для одного объекта. Вот мой application.properties

#Datasources
spring.datasource.primary.jndi-name=jdbc/DS1
spring.datasource.primary.driver-class-name=oracle.jdbc.OracleDriver
spring.datasource.secondary.jndi-name=jdbc/DS2
spring.datasource.secondary.driver-class-name=oracle.jdbc.OracleDriver

#Hibernate 
spring.jpa.database-platform=org.hibernate.dialect.Oracle10gDialect
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
spring.jpa.properties.hibernate.current_session_context_class=jta
spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
spring.jpa.properties.hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
#Jackson properties
spring.jackson.serialization-inclusion=NON_NULL

и моя весна главная: ScApplication.java

@SpringBootApplication
@EnableScheduling
@EnableJpaRepositories(basePackages = { "it.pippo.data.access.database" })
@EntityScan(basePackages = { "it.pippo.data.access.model" })
@ComponentScan(basePackages = { "it.pippo" })
public class ScApplication extends SpringBootServletInitializer implements WebApplicationInitializer {


    public static void main(String[] args) {

        SpringApplication.run(ScApplication.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {

        return application.sources(ScApplication.class);
    }

    @Bean
    public SessionFactory sessionFactory(@Qualifier("entityManagerFactory") EntityManagerFactory emf) {

        return emf.unwrap(SessionFactory.class);
    }

}

Внутри пакета it.pippo.data.access.database У меня есть интерфейс DAO и фасад DAO, который я использую для выполнения операций с источником данных, а в пакете it.pippo.data.access.model у меня есть все сущности моей таблицы. DatabaseDAOFacade.java

@Repository
@Transactional
public class DatabaseDAOFacade implements DatabaseDAOInterface {

    private final SessionFactory sf;

    @SuppressWarnings("unused")
    private EntityManager entityManager;

    protected Session getSession() {

        return sf.getCurrentSession();
    }

    @Autowired
    public DatabaseDAOFacade(SessionFactory sf, EntityManager entityManager) {
        this.sf = sf;
        this.entityManager = entityManager;
    }

    @SuppressWarnings("unchecked")
    public <T> T save(T o) {

        return (T) this.getSession().save(o);
    }
    .
    .
}

Photo.java

@Entity
@Table(name = "T_PHOTO")
public class Photo {

    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.AUTO, generator = "PHOTO_REQUEST_SEQ_GEN")
    @SequenceGenerator(name = "PHOTO_REQUEST_SEQ_GEN", sequenceName = "PHOTO_REQUESTS")
    private Long id;

    @Column(name = "USERID")
    private String userId;

    @Column(name = "UPLOAD_DATE")
    private Date uploadDate;
    .
    .
    .
}

Как я могу указать приложению искать объект Photo во втором JNDI, а не в первом? Я уже перепробовал много разных предложений, но ни одно из них не помогло мне. Кроме того, я не могу слишком сильно изменить структуру приложения.

1 Ответ

0 голосов
/ 14 марта 2019

Я думаю, вам нужно указать, какое соединение следует использовать в каждом репозитории DAO.

Вы можете использовать аннотацию @Qualifier с идентификатором вашего источника данных.

Я никогда не делал этого в весенней загрузке, но с regultar Spring да. Я полагаю, что ваша инъекция фабрики сессий должна выглядеть так:

@Autowired
@Qualifier("primary") //Datasource conection bean id
    public DatabaseDAOFacade(SessionFactory sf, EntityManager entityManager) {
        this.sf = sf;
        this.entityManager = entityManager;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...