identity 전략으로 데이터를 등록했을 때
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파일로 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
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에 종속적이지 않고 보편적으로 사용할 수 있다는 장점도 있습니다.
질문하신 내용에 대해 충분한 답변이 되었길 바랍니다. 더 궁금한 사항이 있다면 언제든지 질문해주세요.
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
33
2
inheritance startegy 선택시 고려사항
0
24
1
Entity 동등성 비교
0
25
1
실무 조언 관련 질문입니다.
0
48
1
H2데이터베이스 파일 생성
0
60
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
57
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
58
1
JPQL 메소드와 락
0
56
1
Delivery @OneToOne
0
63
1
17강 4~5분대 테이블 값 조회가 안됩니다.
0
98
2
UnsupportedOperationException 발생
0
89
3
H2 Database 연결이 안됩니다.
0
98
2
연관관계 매핑 질문드립니다.
0
88
2
h2데이터베이스 실행오류
0
110
2
persistence.xml
0
112
2
양방향 연관관계에서 연관관계의 주인(mappedBy)을 왜 꼭 정해야 하나요?
0
83
1
영속성 컨텍스트
0
70
1
JPA 프록시
0
100
1
Native Query와 MyBatis
0
74
1
영속성 컨텍스트는 어떤 메모리에 저장되는건가요?
0
93
1
임베디드 타입 예시 코드 관련 질문
0
121
3
명시적 조인에서 별칭을 주면 왜 객체에 접근할 수 있나요
0
97
3
인텔리제이 패키지 커서 단축키 질문
0
109
2
혹시 현재는 ID 데이터 타입이 String이면 안되나요?
0
149
1





