상세 컨텐츠

본문 제목

[JPA_Spring&Maven] JPA사용을 위한 persistence xml 설정 및 EntityManagerFactory create 에러 해결

JPA

by Jjiveloper 2021. 5. 19. 21:40

본문

728x90

https://www.youtube.com/watch?v=egVZusxSeKw&lc=UgwPAg3j8fk07aopqeN4AaABAg 

김영한님의 JPA기초강의 수강 중에 생긴 에러 기록


에러 1. hibernate 버전 미일치 에러

org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Exception in thread "main" org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

 

pom.xml

버전을 콘솔에 나온 5.1.2.Final 로 변경해주니 없어짐

(근데 버전을 이렇게 많이 낮춰야되나...??)

---------수정---------

너무 낮은 버전인 것 같아서 강사님이랑 동일하게 5.3.7.Final로 변경함!!!

에러4 를 해결하고 나니 문제가 없어졌다. 기존의 5.4.31.Final로 다시 수정...!!!

혹시 에러4 내용은 문제 없었는데도 해당 에러가뜨면 버전을 변경해보시길 바랍니당


에러 2. persistence.xml 파일의 버전 에러

Caused by: javax.persistence.PersistenceException: Unrecognized persistence.xml version [2.2]

 

src/main/resources/META-INF/persistence.xml

번역기 돌려보니까 2.2버전을 사용할 수 없다고 해서 2.1로 버전을 변경해주니 해결


에러3. jdk버전으로 인한 xml bind 에러

Exception in thread "main" java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException

Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException

 

pom.xml

pom.xml파일에 javax의 xml bind 종속성 추가하니 완료


★ 에러4. h2 driver를 로드해오지 못함_체감상 젤 중요한 문제점!!

4-1) Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.h2.Driver

4-2) Caused by: org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [org.h2.Driver]

4-3) Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

 

이 하나때문에 이렇게 많은 에러가 발생하였다....ㅠㅠㅠㅠ제일 삽질 오래한 파트인듯

pom.xml

해당 의존성을 추가할 때 mvn repository 페이지에서 dependency를 그대로 복사해왔었다.

→ (https://mvnrepository.com/artifact/com.h2database/h2 접속 후 자신의 h2버전에 맞는 곳에 ㄱㄱ)

 

나는 maven으로는 파일을 처음 설정해본거라 저 scope의 의미를 잘 몰랐다....

이제야 어림짐작하건데, 해당 com.h2database의존성 파일은 test시에만 사용하겠다는 의미였던 것이 아닐까...^^

저 <scope> 가 있는 곳을 지워주자

pom.xml

이렇게 바꿔주고 나니까 에러가 2개는 없어졌음

 

Gradle의 경우에는!

testImplementation group: 'com.h2database', name: 'h2', version: '1.4.200'

홈페이지에 이렇게 되어있는데 testImplementation을 implementation으로 변경해주면 된다.


만약 이렇게 했는데도 안된다면, h2가 설치된 폴더에 가서 해당 h2의 jar파일을 프로젝트 라이브러리에 직접 추가해줘야한다고 한다.

해당 내용은 이 블로거님이 잘 정리해두셨었다 → https://dololak.tistory.com/473

나는 이렇게 안해도 해결됐으니 따로 글 쓰진 않겠음!!


에러5. java에서 EntityManagerFactory생성 시 persistence.xml파일의 설정 이름과 불일치

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named (이름)

 

이건 제일 처음부터 발생했던 에러인데, 글 다쓰기 전에 생각나서 추가해봄ㅋㅋㅋㅋ

 

src/main/java/hellojpa/Main.java

EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

메인 함수에서 EntityManagerFactory를 불러와서 create하는 곳이다.

JPA에관해 무지한 상태였기 때문에 해당 코드가 persistence.xml파일과 어떤식으로 작용하는지 하나도 몰랐다.

그래서 저지른 만행

src/main/resources/META-INF/persistence.xml

여기 파일의 <persistence-unit> 부분 끝 name 보이십니까.... 이 이름이랑 main함수의 createEntityManagerFactory() 내의 값과 동일해야하는 것이였다....

그래서 createEntityManagerFactory() 매개변수 값을 persistence-unit의 name값과 동일하게 맞춰주니까 해결되었다!


에러 해결 드디어 끝!!

드디어 에러메시지 없이 System.out.println(); 의 내용을 출력하고나서 EntityManagerFactory가 종료되었다ㅠㅠㅠ감격...


참고하시라고 전체 코드 올립니다.

src/main/resources/META-INF/persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
    <persistence-unit name="test">
        <properties>
            <!-- 필수 속성 -->
            <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
            <property name="javax.persistence.jdbc.user" value="sa"/>
            <property name="javax.persistence.jdbc.password" value=""/>
            <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
            <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
            
            <!-- 옵션 -->
            <!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
            <property name="hibernate.show_sql" value="true"/>
            <!-- SQL 출력 시 보기 쉽게 정렬 -->
            <property name="hibernate.format_sql" value="true"/>
            <!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
            <property name="hibernate.use_sql_comments" value="true"/>
            <!-- JPA 표준에 맞춘 새로운 키 생성 전략 사용 -->
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            
        </properties>
    </persistence-unit>
</persistence>

(참고: https://atoz-develop.tistory.com/entry/JPAHibernate-persistencexml-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95)

 

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>hellojpa</groupId>
  <artifactId>hellojpa</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <dependencies>
		<!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
		<dependency>
		    <groupId>org.hibernate</groupId>
		    <artifactId>hibernate-entitymanager</artifactId>
		    <version>5.4.31.Final</version>
		</dependency>

		<!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
		<dependency>
		    <groupId>com.h2database</groupId>
		    <artifactId>h2</artifactId>
		    <version>1.4.200</version>
		</dependency>
		
		<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api -->
		<dependency>
		    <groupId>javax.xml.bind</groupId>
		    <artifactId>jaxb-api</artifactId>
		    <version>2.3.1</version>
		</dependency>
				
				
  </dependencies>
  
</project>

 

src/main/java/hellojpa/Main.java

package hellojpa;

import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

public class Main {
	public static void main(String args[]) {

		EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
		
		System.out.println("hello");
		emf.close();
	}
}
728x90
반응형

'JPA' 카테고리의 다른 글

[JPA] JPA 어노테이션 활용하여 db에 값 넣기  (0) 2021.05.20

관련글 더보기