2014-01-27 5 views
27

Я пытаюсь настроить конфигурацию весны xml, не создавая futher persistence.xml. Но я постоянно получаю следующее исключение, даже если я включил свойства базы данных в spring.xmlКак настроить Spring без persistence.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:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 
    </bean> 

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
    <property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
      <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
      <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
      <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
     </props> 
     </property> 
    </bean> 

Что я здесь отсутствует?

ответ

27

Укажите свойства «persistenceUnitName» «packagesToScan» & в определении bean entityManagerFactory.

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 

     <property name="persistenceUnitName" value="myPersistenceUnit" /> 
     <property name="packagesToScan" > 
      <list> 
       <value>org.mypackage.*.model</value> 
      </list> 
     </property> 

     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">${hibernate.dialect}</prop> 
       <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop> 
       <prop key="hibernate.show_sql">${hibernate.show_sql}</prop> 
       <prop key="hibernate.format_sql">${hibernate.format_sql}</prop> 
      </props> 
     </property> 
    </bean> 

Обратите внимание, что это весна версия> ответ 3.1

+0

Использование Spring '4.0.0.RELEASE'. Отлично, это работает! – membersound

+1

Знаете ли вы, что вы настраиваете Composite Persistent Unit и его членов без файла persistence.xml так же, как вам это нужно. – Ketan

+0

позволяет нам загружать entityManager с помощью пружины вроде: '' '@PersistenceContext private EntityManager em;' '' – herau

37

От Spring Guide Accessing Data with 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; 
    } 

Spring Загрузочный

С весны Ботинок включена приложение это еще проще:

Образец 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 
+0

это решение работает для меня, за исключением приведенных выше инструкций, setPackagesToScan («имя пакета»), где «имя пакета» - это пакет, включающий классы сущностей, см. Https://docs.spring.io/spring/docs /current/javadoc-api/org/springframework/orm/jpa/LocalContainerEntityManagerFactoryBean.html для справки – IcyBrk

3

MariuszS»является хорошим исключением того, что метод entityManagerFactory должен возвращать EntityManagerFactory. Для этого его можно записать так:

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

Для будущей аудитории: ниже код работал:

@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(); 
} 
2

Если предположить, что у вас есть PersistenceProvider реализации (например, org.hibernate.jpa.HibernatePersistenceProvider), вы можете использовать метод PersistenceProvider#createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) для загрузки EntityManagerFactory без необходимости persistence.xml.

Однако, это раздражает, что вы должны реализовать интерфейс PersistenceUnitInfo, поэтому лучше использовать Spring или Hibernate, которые оба поддерживают самонастройки JPA без persistence.xml файла:

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

Если PersistenceUnitInfo реализуется Spring-specific MutablePersistenceUnitInfo класс.

Отъезд this article для приятной демонстрации того, как вы можете достичь этой цели с помощью Hibernate.

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