以编程方式创建实体管理器而不持久化文件

tam*_*987 3 java entity hibernate entitymanager eclipselink

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

    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);
Run Code Online (Sandbox Code Playgroud)

在线

emf = Persistence.createEntityManagerFactory(idClient, properties);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

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

我该如何解决这个问题?

任何帮助将不胜感激

Bri*_*ice 10

这是一种纯粹的编程方式,可以在没有弹簧的情况下构建实体管理器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();
Run Code Online (Sandbox Code Playgroud)

臭名昭着 PersistenceUnitInfo

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;
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

请注意,Spring提供了简化的方式来配置持久性,同时支持多个hibernate版本.(Spring 4.2支持Hibernate高达5.1,Spring 4.3支持Hibernate高达5.2).


小智 1

persistence.xml根据 JPA 规范,在部署时创建持久性单元必须有一个文件。

请参阅在没有 persistence.xml 配置文件的情况下创建 JPA EntityManager

  • 那不是真的。可以在**没有**`persistence.xml`的情况下引导JPA:https://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/bootstrap/Bootstrap.html (6认同)