강의

멘토링

커뮤니티

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

lgh8079님의 프로필 이미지
lgh8079

작성한 질문수

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

기본 키 매핑

17강 4~5분대 테이블 값 조회가 안됩니다.

작성

·

38

0

package hellojpa;

public enum RoleType {
    GUEST, USER, ADMIN
}
<?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="1234"/>
            <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.jdbc.batch_size" value="10"/>
            <property name="hibernate.hbm2ddl.auto" value="none" />
        </properties>
    </persistence-unit>
</persistence>
package hellojpa;

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

public class JpaMain {

    public static void main(String[] args) {
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

        EntityManager em = emf.createEntityManager();

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

        try {

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

            em.persist(member);

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

        emf.close();
    }
}
package hellojpa;

import javax.persistence.*;

@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name", nullable = false)
    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;
    }
}
image.png

이런 식으로 테이블 값에 아무것도 나타나지 않는데 이게 정상인건가요?

답변 2

0

안녕하세요. lgh8079님, 공식 서포터즈 OMG입니다.

아래 에러 출력문을 한 줄 추가하여 콘솔에 어떤 문구가 출력되는 지 확인부탁드립니다 😀

catch (Exception e) {

e.printStackTrace(); // 추가

tx.rollback();

}

감사합니다.

lgh8079님의 프로필 이미지
lgh8079
질문자

C:\Users\User\.jdks\temurin-21.0.9\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2025.2.2\lib\idea_rt.jar=54817" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath C:\study\ex1-hello-jpa\ex1-hello-jpa\target\classes;C:\Users\User\.m2\repository\javax\xml\bind\jaxb-api\2.3.0\jaxb-api-2.3.0.jar;C:\Users\User\.m2\repository\org\hibernate\hibernate-entitymanager\5.3.10.Final\hibernate-entitymanager-5.3.10.Final.jar;C:\Users\User\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\User\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\User\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\User\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\User\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\User\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\User\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\User\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\User\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\User\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\User\.m2\repository\net\bytebuddy\byte-buddy\1.9.5\byte-buddy-1.9.5.jar;C:\Users\User\.m2\repository\org\jboss\spec\javax\transaction\jboss-transaction-api_1.2_spec\1.1.1.Final\jboss-transaction-api_1.2_spec-1.1.1.Final.jar;C:\Users\User\.m2\repository\com\h2database\h2\1.4.199\h2-1.4.199.jar hellojpa.JpaMain

1월 22, 2026 10:07:08 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation

INFO: HHH000204: Processing PersistenceUnitInfo [

name: hello

...]

1월 22, 2026 10:07:08 오후 org.hibernate.Version logVersion

INFO: HHH000412: Hibernate Core {5.3.10.Final}

1월 22, 2026 10:07:08 오후 org.hibernate.cfg.Environment <clinit>

INFO: HHH000206: hibernate.properties not found

1월 22, 2026 10:07:08 오후 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>

INFO: HCANN000001: Hibernate Commons Annotations {5.0.4.Final}

1월 22, 2026 10:07:09 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure

WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)

1월 22, 2026 10:07:09 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

INFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost/~/test]

1월 22, 2026 10:07:09 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

INFO: HHH10001001: Connection properties: {password=****, user=sa}

1월 22, 2026 10:07:09 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator

INFO: HHH10001003: Autocommit mode: false

1월 22, 2026 10:07:09 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>

INFO: HHH000115: Hibernate connection pool size: 20 (min=1)

1월 22, 2026 10:07:09 오후 org.hibernate.dialect.Dialect <init>

INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect

Hibernate:

/* insert hellojpa.Member

*/ insert

into

Member

(id, name)

values

(null, ?)

1월 22, 2026 10:07:10 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions

WARN: SQL Error: 23502, SQLState: 23502

1월 22, 2026 10:07:10 오후 org.hibernate.engine.jdbc.spi.SqlExceptionHelper logExceptions

ERROR: NULL not allowed for column "ID"; SQL statement:

/* insert hellojpa.Member */ insert into Membe [23502-199]

javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:154)

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:181)

at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:188)

at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:807)

at org.hibernate.internal.SessionImpl.persist(SessionImpl.java:785)

at hellojpa.JpaMain.main(JpaMain.java:23)

Caused by: org.hibernate.exception.ConstraintViolationException: could not execute statement

at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:59)

at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:42)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113)

at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:99)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:178)

at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57)

at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3077)

at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3667)

at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81)

at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645)

at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282)

at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263)

at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317)

at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:332)

at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:289)

at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:196)

at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:127)

at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:192)

at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135)

at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:62)

at org.hibernate.internal.SessionImpl.firePersist(SessionImpl.java:800)

... 2 more

Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:

/* insert hellojpa.Member */ insert into Membe [23502-240]

at org.h2.message.DbException.getJdbcSQLException(DbException.java:520)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)

at org.h2.message.DbException.get(DbException.java:223)

at org.h2.message.DbException.get(DbException.java:199)

at org.h2.table.Column.validateConvertUpdateSequence(Column.java:406)

at org.h2.table.Table.convertInsertRow(Table.java:948)

at org.h2.command.dml.Insert.insertRows(Insert.java:167)

at org.h2.command.dml.Insert.update(Insert.java:135)

at org.h2.command.CommandContainer.executeUpdateWithGeneratedKeys(CommandContainer.java:212)

at org.h2.command.CommandContainer.update(CommandContainer.java:133)

at org.h2.command.Command.executeUpdate(Command.java:306)

at org.h2.command.Command.executeUpdate(Command.java:250)

at org.h2.server.TcpServerThread.process(TcpServerThread.java:386)

at org.h2.server.TcpServerThread.run(TcpServerThread.java:193)

at java.base/java.lang.Thread.run(Thread.java:1583)

at org.h2.message.DbException.getJdbcSQLException(DbException.java:457)

at org.h2.engine.SessionRemote.done(SessionRemote.java:607)

at org.h2.command.CommandRemote.executeUpdate(CommandRemote.java:237)

at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:200)

at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:154)

at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175)

... 19 more

1월 22, 2026 10:07:10 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop

INFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]

Process finished with exit code 0

 

H2 테이블 스키마에서 ID 컬럼이 auto-increment 설정이 안 돼 있어서 Hibernate가 키를 생성 못하고 있는 것으로 보이네요 😀

아래 해결방안을 순차적으로 시도해주세요

 

1.키 생성전략 변경

Member클래스의

@GeneratedValue(strategy = GenerationType.IDENTITY)

=> SEQUENCE로 변경

@GeneratedValue(strategy = GenerationType.SEQUENCE)

2.(키 생성 전략을 바꿔도 해결이 되지 않을 경우) ddl-auto 속성 변경

소스코드는 SEQUENCE로 놓고 persistence.xml의

<propertyname="hibernate.hbm2ddl.auto"value="none" />

=> create로 변경하고 실행. 실행 한 후에는 다시 none으로 변경

<propertyname="hibernate.hbm2ddl.auto"value="create" />

2번의 경우 애플리케이션이 구동되면 기존 테이블이 삭제되므로 다시 none으로 변경해주세요 😀

 

해결이 안될 경우 댓글 남겨주세요!


 

0

안녕하세요, 인프런 AI 인턴입니다.
lgh8079님, H2 데이터베이스에서 테이블에 값이 조회되지 않는 문제를 해결하기 위해 몇 가지 사항을 점검해 보시면 좋겠습니다:

  1. URL 및 파일 확인: H2 데이터베이스의 접속 URL이 jdbc:h2:tcp://localhost/~/test로 설정되어 있습니다. 이 경우, C:\Users\[사용자명]\test.mv.db 파일이 있어야 합니다. 파일이 존재하는지 확인해보세요. 만약 파일이 없다면, 강의에 따라 적합한 파일 위치와 이름을 사용하고 있는지 확인해주세요.

  2. H2 콘솔 URL 확인: 강의에 따라 작성한 JDBC URL과 H2 콘솔 URL이 일치하는지 확인해야 합니다. http://localhost:8082/?key=xxxxxx...에서 jdbc:h2:~/test 또는 jdbc:h2:tcp://localhost/~/test와 맞는지 확인 해주세요.

  3. 트랜잭션 처리: 테이블에 데이터가 저장되지 않는 가장 일반적인 이유 중 하나는 트랜잭션 처리 문제입니다. 예외가 발생하지 않는 한 tx.commit();이 제대로 실행되어야 데이터를 커밋하고 데이터베이스에 저장됩니다. 현재 코드에서는 예외가 발생하는 경우 무조건 롤백이 됩니다. 예외 로그를 확인하여 에러가 발생하는지 확인해주세요.

  4. Database 콘솔: 데이터베이스 콘솔에서 유효한 세션인지, 사용하고 있는 URL 및 데이터베이스 파일이 일치하는지 확인해 보세요. URL에서 정확한 디렉토리가 사용되고 있는지 중요합니다.

  5. 데이터베이스 초기화 옵션 확인: hibernate.hbm2ddl.auto 속성이 none으로 설정되어 있어, 테이블이 자동으로 생성되지 않을 수 있습니다. 처음 실행 시 create 또는 update로 설정하여 테이블이 생성 및 업데이트되는지 확인합니다. 이후에는 none으로 다시 설정하여 사용하는 것을 추천합니다.

이 문제를 해결하기 위한 추가적인 방법으로 인프런 김영한님의 자주하는 질문 가이드를 참조하시는 것도 좋습니다. 더 궁금한 점이 있으면 언제든지 질문해 주세요!

lgh8079님의 프로필 이미지
lgh8079

작성한 질문수

질문하기