복붙노트

[SPRING] Spring-boot + JPA EntityManager 삽입 실패

SPRING

Spring-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. ==============================

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

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

    3.persistence.xml 파일을 계속 사용하려면 구성 클래스에 아래 코드를 추가하면됩니다.

    persistence.xml 파일을 계속 사용하려면 구성 클래스에 아래 코드를 추가하면됩니다.

        @Bean
    public LocalEntityManagerFactoryBean entityManagerFactory(){
        LocalEntityManagerFactoryBean factoryBean = new LocalEntityManagerFactoryBean();
        factoryBean.setPersistenceUnitName("data");
        return factoryBean;
    }
    
  4. from https://stackoverflow.com/questions/30753579/spring-bootjpa-entitymanager-inject-fails by cc-by-sa and MIT license