본문 바로가기
Spring Boot

[Spring Boot] Hibernate 사용 시 Error creating bean with name 'entityManagerFactory' 해결

by Banlim 2020. 8. 21.

[삽질의 기록]

 

프로젝트 실행 시 자동으로 해당 class의 이름을 가진 DataBase table을 생성해주기 위해 Spring boot + JPA(Hibernate) 를 사용하였다. 하지만 이상하게도 Error creating bean with name 'entityManagerFactory' 메시지가 발생하였다.

 

우선 pom.xml에 hibernate를 사용하기 위해 dependency를 추가해주었다.

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
		
<dependency>
	<groupId>com.h2database</groupId>
	<artifactId>h2</artifactId>
	<scope>runtime</scope>
</dependency>

 

그리고 resource/application.yml 파일에 다음 코드를 추가해주었다.

spring:
  jpa:
    show-sql: true
  h2:
    console:
      enabled: true

 

다음으로 User class의 이름을 가진 DB table을 자동으로 생성해주기 위해 User class 위에 @Entity annotation을 추가해준다. 그리고 table의 record를 구분하기 위한 기본 키를 설정을 해야한다. 이 프로젝트의 경우 id 값을 기본 키로 설정하였으며, id가 기본 키 값임을 알려주는 @Id, @GeneratedValue(자동 생성되는 키 값) annotation을 추가해준다. 이렇게 annotation을 설정해주는 것만으로도 우리가 가지고 있는 User의 domain class 정보가 db의 User라는 이름의 table 생성해준다.

@Entity
public class User {
	
	@Id
	@GeneratedValue
	private Integer id;

 

하지만 이렇게 쉽게 될 리가 없지. 당연히 Error가 발생했다. Error 내용을 살펴보면 결국 specified identifier를 못 찾는다는 것 같은데, User class 보면 분명히 @Id 라는 annotation을 추가해주었다.

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'entityManagerFactory' defined in class path resource 
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 
Invocation of init method failed; nested exception is org.hibernate.AnnotationException: 
No identifier specified for entity: com.example.restfulWebService.users.User

 

몇 번의 삽질을 끝에 결국 해결했다. 나의 경우 "@Id" annotation을 사용할 때 아래 코드와 같이 org.springframework.data.annotation.Id 를 import하여 사용했기 때문에 위와 같은 에러가 발생한 것이었다.

import org.springframework.data.annotation.Id;

 

org.springframework.data.annotation.Id -> javax.persistence.Id로 변경하여 import를 하면 문제가 해결된다. 또한 Entity의 경우도 org.hibernate.annotations.Entity로 import하게 되면 사용이 안된다. "@Entity " 이렇게 나온다. 따라서 Entity의 경우도 아래와 같이 javax.persistence.Entity를 import하여 사용해야한다.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

 

이렇게 해결 하면 USER라는 이름의 table이 자동으로 생성된 것을 확인할 수 있다.

'Spring Boot' 카테고리의 다른 글

[Spring Boot] STS에 Lombok 설치 시 무응답 증상  (3) 2020.08.06