[SPRING] persistence.xml없이 Spring을 설정하는 방법은?
SPRINGpersistence.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.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.
@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.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.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로 어떻게이 목표를 달성 할 수 있는지에 대한 좋은 데모를 확인하자.
from https://stackoverflow.com/questions/21381943/how-to-configure-spring-without-persistence-xml by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring의 ConversionService (0) | 2019.01.10 |
---|---|
[SPRING] Spring Boot Rest Controller에서 기본 JSON 오류 응답 수정 (0) | 2019.01.10 |
[SPRING] 싱글 톤과 프로토 타입 빈의 차이점은 무엇입니까? (0) | 2019.01.10 |
[SPRING] 프로그래밍 방식으로 Spring에서 속성 자리 표시자를 결정하는 방법 (0) | 2019.01.10 |
[SPRING] JPA @OneToMany -> 부모 - 하위 참조 (외래 키) (0) | 2019.01.10 |