[SPRING] Spring-boot + JPA EntityManager 삽입 실패
SPRINGSpring-boot + JPA EntityManager 삽입 실패
내 J2EE 애플리케이션에서는 스프링 부트 및 JPA 기술을 사용하여 DAO 레이어에 EntityManager를 삽입하려고합니다. 그러나, 몇 가지 문제가 있습니다 ... 내 CRUD 사용자 저장소 :
@Repository
public class UserRepositoryImpl implements UserRepository {
@PersistenceContext(unitName = "data")
private EntityManager entityManager;
// and crud methods
}
내 스프링 부팅 응용 프로그램 클래스 :
@SpringBootApplication
public class App {
public static void main(String [] args) {
SpringApplication.run(App.class, args);
}
}
마지막으로 src / main / resources / META-INF 폴더에있는 내 persistence.xml은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="data" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<class>com.example.domain.User</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.connection.autocommit" value="false" />
<property name="hibernate.dialect" value="org.hibernate.dialect.SQLServerDialect" />
<property name="hibernate.c3p0.min_size" value="4" />
<property name="hibernate.c3p0.max_size" value="128" />
<property name="javax.persistence.jdbc.url" value="jdbc:sqlserver://localhost:1433;databaseName=qwerty;sendStringParametersAsUnicode=false" />
<property name="javax.persistence.jdbc.user" value="sa" />
<property name="javax.persistence.jdbc.driver" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
<property name="javax.persistence.jdbc.password" value="" />
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.show_sql" value="false" />
</properties>
</persistence-unit>
그래서,이 삽입 된 entityManager를 사용하려고하면 NullPointerException이 발생합니다. 다른 @Autowired 필드는 문제없이 주입됩니다. 이 코드의 문제점은 무엇입니까? 추가 구성이 필요합니까? 저는 초보자이며 (심지어 주니어 개발자조차도 아닙니다.) 스프링 부트가 무엇인지 오해하고 XML 파일에서 스프링과 같이 구성하는 방법에 대해 약간의 오해가 있습니다. EM을 주입하기 위해 이러한 xml 구성이 필요하면 어떻게해야하는지 보여주세요.
upd2. 종속성
<dependencies>
<!-- logger -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</dependency>
<!-- db -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
</dependency>
<dependency>
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>sqljdbc4</artifactId>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.5.3</version>
</dependency>
<!-- csv -->
<dependency>
<groupId>com.opencsv</groupId>
<artifactId>opencsv</artifactId>
<version>3.3</version>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>1.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.2.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.2.4.RELEASE</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
해결법
-
==============================
1.spring-boot-startter-data-jpa에 대한 종속성을 사용해야합니다.
spring-boot-startter-data-jpa에 대한 종속성을 사용해야합니다.
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>
그리고 persistence xml을 사용하려면 문서에서 말하는대로 bean을 정의해야합니다.
http://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-use-traditional-persistence-xml
또는 persistence.xml을 완전히 건너 뛰고 application.properties 파일에서 연결 속성을 정의 할 수 있습니다.
설명서에서 인용
spring.datasource.url=jdbc:mysql://localhost/test spring.datasource.username=dbuser spring.datasource.password=dbpass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
http://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-sql.html#boot-features-connect-to-production-database
(사용자 환경에 맞게 드라이버 및 기타 데이터 변경)
행운을 빕니다!
-
==============================
2.jpa 지속성을 구성하기 위해 Java 구성을 사용할 수 있습니다. 아래 코드는 구성 예제를 보여줍니다.
jpa 지속성을 구성하기 위해 Java 구성을 사용할 수 있습니다. 아래 코드는 구성 예제를 보여줍니다.
@Component public class JpaConfiguration { @Bean @Primary public DataSource dataSource() { final SimpleDriverDataSource dataSource = new SimpleDriverDataSource(); dataSource.setDriver(new org.postgresql.Driver()); dataSource.setUrl("jdbc:postgresql://localhost:5432/users"); dataSource.setUsername("postgres"); dataSource.setPassword("admin"); return dataSource; } @Bean public JpaVendorAdapter jpaVendorAdapter() { HibernateJpaVendorAdapter jpaVendorAdapter = new HibernateJpaVendorAdapter(); jpaVendorAdapter.setGenerateDdl(true); jpaVendorAdapter.setShowSql(true); jpaVendorAdapter.setDatabasePlatform("org.hibernate.dialect.PostgreSQLDialect"); return jpaVendorAdapter; } @Bean public LocalContainerEntityManagerFactoryBean entityManagerFactory() { LocalContainerEntityManagerFactoryBean lef = new LocalContainerEntityManagerFactoryBean(); lef.setPackagesToScan("tn.bergit.crud.entity"); lef.setDataSource(dataSource()); lef.setJpaVendorAdapter(jpaVendorAdapter()); Properties properties = new Properties(); properties.setProperty("hibernate.show_sql", "true"); properties.setProperty("hibernate.jdbc.fetch_size", "100"); properties.setProperty("hibernate.hbm2ddl.auto", "update"); lef.setJpaProperties(properties); return lef; } }
github에서이 예제를 볼 수 있습니다 (여기를 클릭하십시오).
-
==============================
3.persistence.xml 파일을 계속 사용하려면 구성 클래스에 아래 코드를 추가하면됩니다.
persistence.xml 파일을 계속 사용하려면 구성 클래스에 아래 코드를 추가하면됩니다.
@Bean public LocalEntityManagerFactoryBean entityManagerFactory(){ LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean(); factoryBean.setPersistenceUnitName("data"); return factoryBean; }
from https://stackoverflow.com/questions/30753579/spring-bootjpa-entitymanager-inject-fails by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Spring 애플리케이션 시작 오류 : 소스를 비워서는 안됩니다. (0) | 2019.04.21 |
---|---|
[SPRING] 저지 (봄 3.0)? (0) | 2019.04.21 |
[SPRING] 스프링 mvc 빈 배열을 기본값으로 사용 (0) | 2019.04.21 |
[SPRING] 컨텍스트 : 구성 요소 스캔 방식의 프로그래밍 방식? (0) | 2019.04.21 |
[SPRING] 스프링 생성시 기본 생성자가 필요합니까? (0) | 2019.04.20 |