【问题标题】:create entity manager programmatically without persistence file在没有持久性文件的情况下以编程方式创建实体管理器
【发布时间】:2015-04-03 14:30:42
【问题描述】:

我正在尝试在没有持久性文件的情况下以编程方式创建实体工厂管理器

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

在线

emf = Persistence.createEntityManagerFactory(idClient, properties);

我收到错误:

org.springframework.beans.factory.BeanCreationException:创建名为“com****RepositoryFieldsFieldWorkerRepositoryImpl”的bean时出错:调用init方法失败;嵌套异常是 javax.persistence.PersistenceException: No Persistence provider for EntityManager named idClient

我该如何解决这个问题?

任何帮助将不胜感激

【问题讨论】:

  • 视觉变化?这是什么意思?
  • 实际上,该评论的目的是在我告诉您我在编辑时建议的更改的框中...

标签: java hibernate entity eclipselink entitymanager


【解决方案1】:

这是一种纯粹的编程方式来构建一个没有 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();

还有臭名昭著的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;
        }
    };
}

请注意,Spring 提供了一种简化的方式来配置持久性,同时支持多个休眠版本。 (Spring 4.2 支持 Hibernate 到 5.1,Spring 4.3 支持 Hibernate 到 5.2)。

【讨论】:

  • 太棒了!谢谢。
  • 我们也可以在 ImmutableMapImmutableMap 中传入用户名和密码。builder() .put(JPA_JDBC_DRIVER, "oracle.jdbc.driver.OracleDriver") .put(JPA_JDBC_URL, "") .put(DIALECT, Oracle12cDialect.class) .put(JPA_JDBC_USER, "") .put(JPA_JDBC_PASSWORD, "") .build());跨度>
  • 谢谢。有时提供者会有所不同;在我的情况下(非 Spring 项目),它是 org.hibernate.ejb.HibernatePersistence
【解决方案2】:

根据 JPA 规范,persistence.xml 文件是在部署时创建持久性单元所必需的。

Create JPA EntityManager without persistence.xml configuration file

【讨论】:

  • 我创建了一个 persistence.xml 文件,但我遇到了同样的问题 w3.org/2001/XMLSchema-instance" xsi:schemaLocation="java.sun.com/xml/ns/persistence java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> javax.persistence.spi.PeristenceProvider持久性单元>
  • 你重新部署你的应用了吗?日志应包含 PU 已正确加载的确认。如果在创建 Emf 时指定了提供程序,则无需在 persistence.xml 文件中指定提供程序。或者更好的是,如果您不需要在运行时更改它们,请将所有属性放在 persistence.xml 文件中
  • 我删除了 tomcat 和 mvn clean install 并重新部署了同样的问题:(
  • 我必须动态地这样做,所以理想情况下所有属性都必须在代码中
  • 这不是真的。 没有 persistence.xml 可以引导 JPA:docs.jboss.org/hibernate/orm/5.2/userguide/html_single/chapters/…
猜你喜欢
  • 1970-01-01
  • 2015-02-18
  • 2017-10-19
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-23
相关资源
最近更新 更多