작성
·
378
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 데이터베이스를 기반으로 동작하도록 코드를 고친 다음에
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.