복붙노트

[SPRING] persistence.xml없이 Spring을 설정하는 방법은?

SPRING

persistence.xml없이 Spring을 설정하는 방법은?

난 더 많은 persistence.xml을 만들지 않고도 스프링 XML 구성을 설정하려고한다. 하지만 나는 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 :

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

내가 여기서 무엇을 놓치고 있니?

해결법

  1. ==============================

    1.entityManagerFactory bean 정의에서 "packagesToScan"& "persistenceUnitName"특성을 지정하십시오.

    entityManagerFactory bean 정의에서 "packagesToScan"& "persistenceUnitName"특성을 지정하십시오.

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

    이것은 Spring version> 3.1 용이다.

  2. ==============================

    2.

    @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 Boot가 활성화 된 응용 프로그램을 사용하면 훨씬 쉽습니다.

    샘플 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
    
  3. ==============================

    3.entityManagerFactory 메소드가 EntityManagerFactory를 반환해야한다는 것을 제외하고는 MariuszS의 대답이 좋습니다. 이렇게하려면 다음과 같이 작성할 수 있습니다.

    entityManagerFactory 메소드가 EntityManagerFactory를 반환해야한다는 것을 제외하고는 MariuszS의 대답이 좋습니다. 이렇게하려면 다음과 같이 작성할 수 있습니다.

    @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();
    }
    
  4. ==============================

    4.PersistenceProvider 구현 (예 : org.hibernate.jpa.HibernatePersistenceProvider)이 있다고 가정하면 persistence.xml을 사용하지 않고 PersistenceProvider # createContainerEntityManagerFactory (PersistenceUnitInfo info, Map map) 메소드를 사용하여 EntityManagerFactory를 부트 스트랩 할 수 있습니다.

    PersistenceProvider 구현 (예 : org.hibernate.jpa.HibernatePersistenceProvider)이 있다고 가정하면 persistence.xml을 사용하지 않고 PersistenceProvider # createContainerEntityManagerFactory (PersistenceUnitInfo info, Map map) 메소드를 사용하여 EntityManagerFactory를 부트 스트랩 할 수 있습니다.

    그러나 PersistenceUnitInfo 인터페이스를 구현해야한다는 것은 짜증나, persistence.xml 파일없이 JPA를 부트 스트랩하는 것을 지원하는 Spring이나 Hibernate를 사용하는 것이 더 낫다.

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

    PersistenceUnitInfo가 Spring 고유의 MutablePersistenceUnitInfo 클래스에 의해 구현되는 곳.

    이 기사에서 Hibernate로 어떻게이 목표를 달성 할 수 있는지에 대한 좋은 데모를 확인하자.

  5. from https://stackoverflow.com/questions/21381943/how-to-configure-spring-without-persistence-xml by cc-by-sa and MIT license