Como configurar o Spring sem persistence.xml?

Eu estou tentando configurar a configuração xml de primavera sem ter que criar um persistence.xml futher. Mas estou constantemente recebendo a seguinte exceção, mesmo que eu tenha incluído as propriedades do database no spring.xml

  Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in file [C:\Users\me\workspace\app\src\main\webapp\WEB-INF\applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml} 

spring.xml:

            ${hibernate.dialect} ${hibernate.hbm2ddl.auto} ${hibernate.show_sql} ${hibernate.format_sql}    

O que estou perdendo aqui?

Especifique as propriedades “packagesToScan” e “persistenceUnitName” na definição do bean entityManagerFactory.

      org.mypackage.*.model     ${hibernate.dialect} ${hibernate.hbm2ddl.auto} ${hibernate.show_sql} ${hibernate.format_sql}    

Note que isto é para a versão Spring> 3.1

Do Guia spring Acessando Dados com JPA

 @Configuration @EnableJpaRepositories public class Application { @Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder().setType(H2).build(); } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); lef.setDataSource(dataSource); lef.setJpaVendorAdapter(jpaVendorAdapter); lef.setPackagesToScan("hello"); return lef; } @Bean public JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter(); hibernateJpaVendorAdapter.setShowSql(false); hibernateJpaVendorAdapter.setGenerateDdl(true); hibernateJpaVendorAdapter.setDatabase(Database.H2); return hibernateJpaVendorAdapter; } 

Bota primavera

Com o aplicativo Spring Boot ativado, isso é ainda mais fácil:

Exemplo de application.yaml

 spring: datasource: url: jdbc:h2:mem:test username: sa password: sa driver-class-name: org.h2.Driver jpa: database: H2 show-sql: false hibernate: format_sql: true ddl-auto: auto 

A resposta de MariuszS é boa, exceto que o método entityManagerFactory deve retornar EntityManagerFactory. Para fazer isso, pode ser escrito assim:

 @Bean public EntityManagerFactory entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); lef.setDataSource(dataSource); lef.setJpaVendorAdapter(jpaVendorAdapter); lef.setPackagesToScan("hello"); return lef.object(); } 

Para o público futuro: abaixo do código trabalhado:

 @Bean (name = "entityManagerFactory") public EntityManagerFactory entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter) { LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); lef.setDataSource(dataSource); lef.setJpaVendorAdapter(jpaVendorAdapter); lef.setPackagesToScan("*.models*"); lef.afterPropertiesSet(); // It will initialize EntityManagerFactory object otherwise below will return null return lef.getObject(); } 

Supondo que você tenha uma implementação de PersistenceProvider (por exemplo, org.hibernate.jpa.HibernatePersistenceProvider ), você pode usar o método PersistenceProvider # createContainerEntityManagerFactory (PersistenceUnitInfo info, Map map) para fazer o bootstrap de um EntityManagerFactory sem precisar de um persistence.xml .

No entanto, é irritante que você tenha que implementar a interface PersistenceUnitInfo , então é melhor usar o Spring ou o Hibernate, que suportam o bootstrapping do JPA sem um arquivo persistence.xml :

 this.nativeEntityManagerFactory = provider.createContainerEntityManagerFactory( this.persistenceUnitInfo, getJpaPropertyMap() ); 

Onde o PersistenceUnitInfo é implementado pela class MutablePersistenceUnitInfo específica da primavera .

Confira este artigo para uma boa demonstração de como você pode atingir esse objective com o Hibernate.