인프런 커뮤니티 질문&답변

이주현님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

기본 키 매핑

GenerationType.IDENTITY Null값 허용 안 되는 에러

작성

·

812

0

안녕하세요. 기본 키 맵핑에서 GenerationType.IDENTITY 관련 부분 질문드립니다.

GenerationType.IDENTITY는 PK를 입력하지 않아도 auto increment라고 해서 저절로 생성되는 거 아닌가요?

그런데 이런 에러가 떴습니다.
ERROR: NULL not allowed for column "ID"; SQL statement:

답변 부탁드리겠습니다. 감사합니다!

package hellojpa;

import javax.persistence.*;


@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "name")
    private String username;


    public Member() { // 기본 생성자가 하나 있어야 함
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}
package hellojpa;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import javax.transaction.Transaction;

public class JpaMain {
    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        // EntityManagerFactory는 application 로딩 시점에 딱 하나만 만들어놔야 한다.
        // Transaction 단위로 EntityManager를 만든다.
        EntityManager em = emf.createEntityManager(); // 쉽게 생각하면 데이터베이스 connection을 하나 받았다고 생각할 수 있음.

        EntityTransaction tx = em.getTransaction();
        tx.begin();

        try{
            Member member = new Member();
            member.setUsername("Opeahchsdf");

            em.persist(member);

            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close(); // 끝나면 반드시 닫아줘야 함
        }

        emf.close();
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="hello">
        <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"/>
            <!-- 옵션 -->
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
            <property name="hibernate.hbm2ddl.auto" value="create" />
        </properties>
    </persistence-unit>
</persistence>

 

 

답변 2

1

안녕하세요, 인프런 AI 인턴입니다.

이주현님, GenerationType.IDENTITY를 사용할 때 발생하는 NULL not allowed for column "ID" 오류에 대해서는 여러 가능한 원인이 있을 수 있습니다. 그 중 하나로 데이터베이스 버전의 문제나 설정 오류가 있을 수 있습니다.

해당 오류는 @GeneratedValue(strategy = GenerationType.IDENTITY) 애노테이션을 사용하면, 데이터베이스가 자동으로 기본 키 값을 생성해야 하는데, 그 과정에서 ID 컬럼에 null 값을 허용하지 않아 발생하는 것입니다. JPA 구현체(예: Hibernate)가 데이터베이스에 적절한 ID 값을 요청하는 방법을 사용해야 하며, H2 데이터베이스에서 이를 처리하는 방식이 변경되었을 가능성이 높습니다.

다른 사용자가 유사한 문제를 겪어서 올린 질문에 제공된 답변들이 도움이 될 수 있습니다. 예를 들어, H2 버전 다운그레이드 또는 기타 설정 변경을 제안하는 내용입니다. 여기 해당 답변의 링크를 공유드립니다:

위 질문에서는 H2 데이터베이스 버전 문제로 보이며, 구체적으로 spring.datasource.urlMODE=MySQL을 추가하거나, @GeneratedValue(strategy = GenerationType.SEQUENCE)로 변경하는 것이 해결책으로 조언되었습니다.

또한 이와 유사한 다른 질문의 답변에서도 문제를 해결하기 위한 방법을 찾을 수 있습니다:

위 링크에서는 H2 데이터베이스 버전을 특정 버전으로 변경하는 것이 해결 방법으로 언급되었습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

0

저도 똑같은 오류가 떠서 1.4.200버전으로 바꿔보고 MODE도 붙여봤는데 안되네요.. 왜 안될까요..