Java 以编程方式创建实体管理器,而不使用持久性文件

Java 以编程方式创建实体管理器,而不使用持久性文件,java,hibernate,entity,eclipselink,entitymanager,Java,Hibernate,Entity,Eclipselink,Entitymanager,我正在尝试以编程方式创建实体工厂管理器,而不使用持久性文件 EntityManagerFactory emf; Map<String, String> properties = new HashMap<String, String>(); properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); properties.put("hibernat

我正在尝试以编程方式创建实体工厂管理器,而不使用持久性文件

    EntityManagerFactory emf;
    Map<String, String> properties = new HashMap<String, String>();
    properties.put("hibernate.connection.driver_class", "com.mysql.jdbc.Driver");
    properties.put("hibernate.connection.url", "jdbc:mysql://173.194.25***************");
    properties.put("hibernate.connection.username", "etech****");
    properties.put("hibernate.connection.password", "A*****");
    properties.put("hibernate.dialect", "org.hibernate.dialect.MySQLDialect");
    properties.put("hibernate.show-sql", "true");
    properties.put("provider", "org.hibernate.ejb.HibernatePersistence");
    emf = Persistence.createEntityManagerFactory(idClient, properties);
我得到一个错误:

org.springframework.beans.factory.BeanCreationException:创建名为“com****repositoryFieldsFieldsFieldWorkerRepositoryImpl”的bean时出错:调用init方法失败;嵌套异常为javax.persistence.PersistenceException:没有名为idClient的EntityManager的持久性提供程序

我如何解决这个问题


任何帮助都将不胜感激。

根据JPA规范,在部署时创建持久化单元时,必须使用
persistence.xml
文件


请参见

这里是一种纯编程的方法,可以在不使用spring和
persistence.xml的情况下构建实体管理器。常量取自
org.hibernate.cfg.AvailableSettings

entityManagerFactory = new HibernatePersistenceProvider().createContainerEntityManagerFactory(
            archiverPersistenceUnitInfo(),
            ImmutableMap.<String, Object>builder()
                    .put(JPA_JDBC_DRIVER, JDBC_DRIVER)
                    .put(JPA_JDBC_URL, JDBC_URL)
                    .put(DIALECT, Oracle12cDialect.class)
                    .put(HBM2DDL_AUTO, CREATE)
                    .put(SHOW_SQL, false)
                    .put(QUERY_STARTUP_CHECKING, false)
                    .put(GENERATE_STATISTICS, false)
                    .put(USE_REFLECTION_OPTIMIZER, false)
                    .put(USE_SECOND_LEVEL_CACHE, false)
                    .put(USE_QUERY_CACHE, false)
                    .put(USE_STRUCTURED_CACHE, false)
                    .put(STATEMENT_BATCH_SIZE, 20)
                    .build());

entityManager = entityManagerFactory.createEntityManager();

请注意,Spring提供了配置持久性的优化方法,同时支持多个hibernate版本。(Spring4.2支持Hibernate升级到5.1,Spring4.3支持Hibernate升级到5.2)。

视觉变化?这意味着什么?事实上,这个评论本来是要放在我告诉你我在编辑时建议做什么更改的盒子里的……我创建了一个persistence.xml文件,但我有同样的问题javax.persistence.spi.PeristenceProvider你重新部署了你的应用程序吗?日志应包含PU已正确加载的确认。如果在创建Emf时指定提供程序,则不需要在persistence.xml文件中指定它。或者更好,如果您不需要在运行时更改它们,请将所有属性放在persistence.xml文件中i delete tomcat和mvn clean install并重新部署它,解决相同的问题:(我必须动态地这样做,因此理想情况下,所有属性都必须使用不正确的代码。可以在不使用持久性.xml的情况下引导JPA:太棒了!谢谢。我们还可以在ImmutableMapImmutableMap.builder().put(JPA_JDBC_驱动程序,“oracle.JDBC.DRIVER.OracleDriver”)中传递用户名和密码。).put(JPA_JDBC_URL,”).put(方言,Oracle12cDialect.class).put(JPA_JDBC_用户,”).put(JPA_JDBC_密码,”
entityManagerFactory = new HibernatePersistenceProvider().createContainerEntityManagerFactory(
            archiverPersistenceUnitInfo(),
            ImmutableMap.<String, Object>builder()
                    .put(JPA_JDBC_DRIVER, JDBC_DRIVER)
                    .put(JPA_JDBC_URL, JDBC_URL)
                    .put(DIALECT, Oracle12cDialect.class)
                    .put(HBM2DDL_AUTO, CREATE)
                    .put(SHOW_SQL, false)
                    .put(QUERY_STARTUP_CHECKING, false)
                    .put(GENERATE_STATISTICS, false)
                    .put(USE_REFLECTION_OPTIMIZER, false)
                    .put(USE_SECOND_LEVEL_CACHE, false)
                    .put(USE_QUERY_CACHE, false)
                    .put(USE_STRUCTURED_CACHE, false)
                    .put(STATEMENT_BATCH_SIZE, 20)
                    .build());

entityManager = entityManagerFactory.createEntityManager();
private static PersistenceUnitInfo archiverPersistenceUnitInfo() {
    return new PersistenceUnitInfo() {
        @Override
        public String getPersistenceUnitName() {
            return "ApplicationPersistenceUnit";
        }

        @Override
        public String getPersistenceProviderClassName() {
            return "org.hibernate.jpa.HibernatePersistenceProvider";
        }

        @Override
        public PersistenceUnitTransactionType getTransactionType() {
            return PersistenceUnitTransactionType.RESOURCE_LOCAL;
        }

        @Override
        public DataSource getJtaDataSource() {
            return null;
        }

        @Override
        public DataSource getNonJtaDataSource() {
            return null;
        }

        @Override
        public List<String> getMappingFileNames() {
            return Collections.emptyList();
        }

        @Override
        public List<URL> getJarFileUrls() {
            try {
                return Collections.list(this.getClass()
                                            .getClassLoader()
                                            .getResources(""));
            } catch (IOException e) {
                throw new UncheckedIOException(e);
            }
        }

        @Override
        public URL getPersistenceUnitRootUrl() {
            return null;
        }

        @Override
        public List<String> getManagedClassNames() {
            return Collections.emptyList();
        }

        @Override
        public boolean excludeUnlistedClasses() {
            return false;
        }

        @Override
        public SharedCacheMode getSharedCacheMode() {
            return null;
        }

        @Override
        public ValidationMode getValidationMode() {
            return null;
        }

        @Override
        public Properties getProperties() {
            return new Properties();
        }

        @Override
        public String getPersistenceXMLSchemaVersion() {
            return null;
        }

        @Override
        public ClassLoader getClassLoader() {
            return null;
        }

        @Override
        public void addTransformer(ClassTransformer transformer) {

        }

        @Override
        public ClassLoader getNewTempClassLoader() {
            return null;
        }
    };
}