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
@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; }
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.