Невозможно получить инъекцию entityManager, используя @PersistenceContext - PullRequest
0 голосов
/ 21 сентября 2019

Я пытался создать конфигурацию базы данных на основе свойств, используя Spring Boot и Jpa, используя Hibernate в качестве поставщика.У меня был этот EntityManagerBuider, который вызывался из класса конфигурации. getEntityManagerFactory вызывался из класса клиента.

public class EntityManagerBuilder  {

    private static String PACKAGES_TO_SCAN="packagesToScan";

    private static String PERSISTANT_UNIT_NAME="persistence.unit.name";

    private static String HIBERNATE_DIALECT_CONSTANT="hibernate.dialect";

    private static String HIBERNATE_DIALECT_DEFAULT_VALUE="org.hibernate.dialect.MySQL";

    private static String HIBERNATE_HBM2DDL_CONSTANT="hibernate.hbm2ddl.auto";

    private static String HIBERNATE_HBM2DDL_DEFAULT_VALUE="none";

    private static Logger logger= LoggerFactory.getLogger(EntityManagerBuilder.class);

    public EntityManagerBuilder(){

    }

    public static EntityManager getEntityManager(EntityManagerFactory entityManagerFactory){
        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
                =new LocalContainerEntityManagerFactoryBean();
        return entityManagerFactory.createEntityManager();

    }

    public static EntityManagerFactory getEntityManagerFactory(DataSource dataSource,
                                                               Map<String,String> jpaProperties,
                                                               Map<String,String> jpaEntityInfo,
                                                               String transaction,
                                                               ConfigurableBeanFactory configurableBeanFactory){

        LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean
                =new LocalContainerEntityManagerFactoryBean();
        Properties properties=new Properties();
        properties.putAll(jpaProperties);
        localContainerEntityManagerFactoryBean.setJpaVendorAdapter(getVendorAdaptor());
        if(jpaEntityInfo==null || jpaEntityInfo.get(PACKAGES_TO_SCAN)==null){
            throw new IllegalArgumentException("Packages to scan required in jpa configuration ");
        }
        if(jpaProperties.get(HIBERNATE_DIALECT_CONSTANT)==null){
            logger.warn("Hibernate dialect not set choosing default as null");
            jpaProperties.put(HIBERNATE_DIALECT_CONSTANT, HIBERNATE_DIALECT_DEFAULT_VALUE);
        }
        if(jpaProperties.get(HIBERNATE_HBM2DDL_CONSTANT)==null){
            logger.warn("Hibernate HB2DDL not set choosing mysql as default");
            jpaProperties.put(HIBERNATE_HBM2DDL_CONSTANT, HIBERNATE_HBM2DDL_DEFAULT_VALUE);
        }
        localContainerEntityManagerFactoryBean.setPackagesToScan(jpaEntityInfo.get(PACKAGES_TO_SCAN));
        localContainerEntityManagerFactoryBean.setPersistenceUnitName("perisisted");
        localContainerEntityManagerFactoryBean.setJpaProperties(properties);
        localContainerEntityManagerFactoryBean.setDataSource(dataSource);
        localContainerEntityManagerFactoryBean.afterPropertiesSet();
//registering spring bean object 
        configurableBeanFactory.registerSingleton(transaction, localContainerEntityManagerFactoryBean.getObject());
        return localContainerEntityManagerFactoryBean.getObject();

    }

    private static HibernateJpaVendorAdapter getVendorAdaptor() {
        HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        vendorAdapter.setDatabase(Database.MYSQL);
        vendorAdapter.setShowSql(true);
        return vendorAdapter;
    }
}

Проблема, с которой я столкнулся, заключается в том, что я не могу ввестиДиспетчер сущностей из контекста постоянства. Бобы весны не настроены к моменту введения контекста постоянства.Конфигурационный код контейнера Spring никогда не выполняется, вместо этого он начинает внедрять контекст персистентности контекста jpa до контекста Spring.

@Repository
public class BooksDao  {

    @Autowired
    private EntityManageModuleAware entityManageModuleAware;

    @PersistenceContext(unitName = "persisted")
    private EntityManager entityManager;


    private ApplicationContext applicationContext;


}

И, таким образом, я сталкиваюсь с этой ошибкой каждый раз, когда я запускаю приложение

***************************
APPLICATION FAILED TO START
***************************

Description:

**A component required a bean named 'persisted' that could not be found.**

Есть ли способ конфигурирования пружинных бинов до того, как контекст персистентности будет введен .Я хочу использовать @Transactional с несколькими настроенными источниками данных.Мысль о создании компонентов управления объектами с соответствующими именами модулей персистентности и думали, что я получу контекст персистентности на уровне Дао.

Я также сделал транзакционные бины: -

public  static void setTransactionBean(EntityManagerFactory entityManagerFactory , DataSource dataSource,
                                                  String transactionName){
        JpaTransactionManager jpaTransactionManager=new JpaTransactionManager();
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        jpaTransactionManager.setDataSource(dataSource);
        ConfigurableBeanFactory configurableBeanFactory=(ConfigurableBeanFactory)beanFactoryStatic;
        configurableBeanFactory.registerSingleton(transactionName, jpaTransactionManager);
    }


Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...