Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法使用@PersistenceContext获取InjectEntityManager_Java_Hibernate_Spring Boot_Jpa_Spring Data Jpa - Fatal编程技术网

Java 无法使用@PersistenceContext获取InjectEntityManager

Java 无法使用@PersistenceContext获取InjectEntityManager,java,hibernate,spring-boot,jpa,spring-data-jpa,Java,Hibernate,Spring Boot,Jpa,Spring Data Jpa,我试图使用SpringBoot和jpa,使用hibernate作为提供程序,进行基于属性的多数据库配置。我有一个EntityManagerBuilder,它被一个配置类调用。getEntityManagerFactory被客户端类调用 public class EntityManagerBuilder { private static String PACKAGES_TO_SCAN="packagesToScan"; private static String PERSIS

我试图使用SpringBoot和jpa,使用hibernate作为提供程序,进行基于属性的多数据库配置。我有一个EntityManagerBuilder,它被一个配置类调用。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;
    }
}

因此,我每次运行应用程序时都会遇到这个错误

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

Description:

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

在注入持久性上下文之前,有没有办法配置Springbean。 我想在配置了多个数据源的情况下使用@Transactional。因此,我考虑创建EntityManagerFactorybean,以及它们各自的持久化单元名称,并认为我将获得Dao级别的持久化上下文

我还制作了事务bean:-

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);
    }



您没有显示全部代码。这就是为什么很难理解你在做什么。顺便问一下,为什么您要以编程方式配置它,而不是通过配置文件?您必须显示从哪里调用这些静态方法,正如mentalurg所建议的,您应该通过使用配置来使用Bean,即使您希望自定义属性使用@Value
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);
    }