• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

Hello JPA 실습 중 발생한 에러에 대하여 질문있습니다!!

22.12.28 02:18 작성 조회수 270

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
안녕하세요, 아래의 코드에서 첫 번째 트랜잭션과 두 번째 트랜잭션은 정상 작동하지만

세 번째 트랜잭션에서 에러가 발생하였습니다. 정확하게는 createQuery()를 호출할 때, 에러가 발생하였습니다.

발생한 에러는 다음과 같습니다.

org.hibernate.hql.internal.ast.ErrorTracker reportError
ERROR: line 1:8: unexpected token: member

SELECT member FROM Member AS member라고 적은 것이 문제일까 싶어서 member를 m으로 수정하면 다음의 에러로 바뀌었습니다.

org.hibernate.hql.internal.ast.ErrorTracker reportError
ERROR: line 1:8: unexpected token: Member

구글링의 결과 unexpected token 에러가 발생하는 원인이 명확하지 않아서 결국 에러를 해결하지 못하였습니다.

추가적으로 강의에서 진행한 것과 달리 MySQL을 사용하였으며, Dialect는 MySQL57Dialect를 사용하였습니다.

첫 번째 트랜잭션과 두 번째 트랜잭션이 올바르게 작동한 것으로 보아 MySQL의 문제가 아닌 것으로 생각되는 데 정확히 어떤 문제인지 검색을 통해 파악하지 못하여 부득이하게 질문 남깁니다.

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;

public class HelloJpa {

    public static void main(String[] args) {
        // Factory는 어플리케이션 로딩 시점에 한 번만 만들면 충분하다.
        EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("hello");

        // 첫 번째 트랜잭션
        insertMember(entityManagerFactory);

        // 두 번째 트랜잭션
        updateMember(entityManagerFactory);

        // 세 번째 트랜잭션
        selectMembers(entityManagerFactory);

        // 어플리케이션 종료 시 자원 해제
        entityManagerFactory.close();
    }

    private static void insertMember(EntityManagerFactory entityManagerFactory) {
        // Factory로부터 만드는 EntityManager는 각 트랜잭션에 대하여 하나씩 만들어야 한다.
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        // 트랜잭션 단위로 DB 접근
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();

        try {
            Member member = new Member();
            member.setId(3L);
            member.setName("HelloA");

            entityManager.persist(member);
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            // 트랜잭션 완료 후 자원 해제
            entityManager.close();
        }
    }

    private static void updateMember(EntityManagerFactory entityManagerFactory) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();

        try {
            // select로 조회한 객체는 JPA의 관리 대상이 된다.
            Member finded = entityManager.find(Member.class, 2L);
            finded.setName("HelloP");

            // 트랜잭션을 커밋하는 시점에
            // JPA에서는 관리 대상인 객체가 변경된 것을 체크하고,
            // 변경된 객체에 대하여 update 쿼리를 보낸다.
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            entityManager.close();
        }
    }

    private static void selectMembers(EntityManagerFactory entityManagerFactory) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        EntityTransaction tx = entityManager.getTransaction();
        tx.begin();

        try {
            // 에러 발생
            List<Member> members = entityManager.createQuery("SELECT member FROM Member AS member", Member.class)
                                                .getResultList();

            members.forEach(member -> System.out.println(member.getName()));
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
        } finally {
            entityManager.close();
        }
    }

}

답변 1

답변을 작성해보세요.

0

안녕하세요., zx3024님

먼저 다음과 같이 고쳐보시겠어요?

SELECT member FROM Member AS member

-> SELECT m FROM Member AS m

만약 그래도 정상 동작하지 않는다면 H2 데이터베이스를 기반으로 동작하도록 코드를 고친 다음에

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

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

https://bit.ly/3fX6ygx

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

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

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.