작성
·
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.url
의 MODE=MySQL
을 추가하거나, @GeneratedValue(strategy = GenerationType.SEQUENCE)
로 변경하는 것이 해결책으로 조언되었습니다.
또한 이와 유사한 다른 질문의 답변에서도 문제를 해결하기 위한 방법을 찾을 수 있습니다:
위 링크에서는 H2 데이터베이스 버전을 특정 버전으로 변경하는 것이 해결 방법으로 언급되었습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
0