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

초보개발자님의 프로필 이미지
초보개발자

작성한 질문수

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

기본 키 매핑

identity 전략으로 데이터를 등록했을 때

해결된 질문

작성

·

106

0

24:13 쯤의 코드 출력을 보면 values 에 null 값이 들어가는
============

Hibernate:

/* insert for

hellojpa.Member */insert

into

Member (name, id)

values

(?, default)

============

저는 이런식으로 나오네요...

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

    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;
    }

    public Member() {
    }

}
public class JpaMain {

    public static void main(String[] args) {
        
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        
        EntityManager em = emf.createEntityManager();
        //code
        EntityTransaction tx = em.getTransaction();
        tx.begin();

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

            System.out.println("============");
            em.persist(member );
            System.out.println("============");
            tx.commit(); 

        } catch (Exception e) {
            tx.rollback();
        } finally {
            em.close();
        }
        emf.close();
    }
}


답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. 초보개발자님

하이버네이트 버전에 따라서 로그를 표현하는 방식이 다를 수 있는데요.

코드를 확인해보아야 정확한 답변을 드릴 수 있을 것 같아요.

실제 동작하는 전체 프로젝트를 ZIP파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

 

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 문제 영역을 실행할 수 있는 방법

2. 문제가 어떻게 나타나는지에 대한 상세한 설명 (오류 화면, 오류 로그 포함)

링크: 공식 서포터즈

링크: 자주하는 질문

감사합니다.

0

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

초보개발자님, JPA의 @GeneratedValue(strategy = GenerationType.IDENTITY) 전략을 사용할 때의 현상에 대해 질문해주셨네요. GenerationType.IDENTITY 전략을 사용하면, 엔티티의 id 값이 데이터베이스에 의해 자동으로 생성되는데요, 이 방식은 주로 데이터베이스가 자동으로 키 생성을 담당하는 경우 (예: MySQL의 AUTO_INCREMENT) 사용됩니다.

코드 출력에서 values (?, default) 로 나타나는 이유는, GenerationType.IDENTITY 전략을 사용할 때 JPA 구현체(예: Hibernate)가 엔티티를 데이터베이스에 저장하는 순간 실제 id 값을 얻기 위해 즉시 INSERT SQL을 실행해야 하기 때문입니다. 여기서 default는 데이터베이스가 자동으로 값을 할당하라는 의미입니다. id 필드에 직접 값을 할당하지 않고, 데이터베이스가 자동으로 생성한 값을 기대하기 때문에 이와 같은 SQL이 생성되고 실행됩니다.

따라서 member.setUsername("C") 후에 em.persist(member)를 호출할 때, id 값은 null 상태입니다. 그러나 이후 실제 데이터베이스에 INSERT가 이루어지고 나면, 데이터베이스가 생성한 id 값이 Member 엔티티의 id 필드에 반영됩니다.

이러한 방식은 데이터베이스에서 실제로 엔티티를 저장한 후에야 식별자를 얻을 수 있기 때문에, 엔티티의 식별자가 필요한 작업을 즉시 수행하기 어려울 수 있는 단점이 있습니다. 하지만, 이 방식은 특정 DB에 종속적이지 않고 보편적으로 사용할 수 있다는 장점도 있습니다.

질문하신 내용에 대해 충분한 답변이 되었길 바랍니다. 더 궁금한 사항이 있다면 언제든지 질문해주세요.

초보개발자님의 프로필 이미지
초보개발자

작성한 질문수

질문하기