2015-04-03 2 views
1

Я пытаюсь создать объект менеджер Factory программно без сохранения состояния файласоздать диспетчер сущностей программно без сохранения состояния файла

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: Error creating bean with name 'com****RepositoryFieldsFieldWorkerRepositoryImpl': Invocation of init method failed; nested exception is javax.persistence.PersistenceException: No Persistence provider for EntityManager named idClient

Как я могу решить эту проблему?

любая помощь будет оценена

+0

Визуальные изменения? что это значит ? – tamtoum1987

+0

На самом деле этот комментарий должен был быть в поле, где я рассказал вам, какие изменения я предложил при редактировании ... – rfornal

ответ

0

persistence.xml файл является обязательным для создания единицы сохранения во время развертывания, как в спецификации JPA.

См Create JPA EntityManager without persistence.xml configuration file

+0

Я создал файл persistence.xml, но у меня такая же проблема <константа-единица name = "idClient"> javax.persistence.spi.PeristenceProvider ersistence-unit> tamtoum1987

+0

Вы перераспределили приложение? в журналах должно быть указано, что PU был загружен должным образом. Вам не нужно указывать поставщика в файле persistence.xml, если вы укажете его при создании Emf. Или лучше, если вам не нужно менять их во время выполнения, поместите все свойства в файл persistence.xml – mssch

+0

i delete tomcat и mvn clean install и перераспределили эту же проблему :( – tamtoum1987

5

Вот чисто программный способ построить менеджер сущности без пружины и без 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 предлагает усовершенствованный способ настроить сохранение, в то время как поддержка нескольких версий Hibernate. (Spring 4.2 поддерживает Hibernate до 5.1, Spring 4.3 поддерживает Hibernate до 5.2).

+0

Awesome! Спасибо. – Krismorte

Смежные вопросы