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

raewoo0908님의 프로필 이미지

작성한 질문수

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

경로 표현식

team.members.size 쿼리 사용 시 디비 데이터가 삭제되는 현상

24.07.13 18:46 작성

·

99

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

강의에 나온 대로 t.members.size를 가져오는 쿼리를 작성 후 실행해봤습니다. 하지만 결과가 나오지 않고, h2디비에 들어가서 값을 확인해보니 값이 모두 지워져있습니다. jpql쿼리를 작성하고 결과를 가져오는 코드를 주석으로 처리하고 돌려보면, 값이 제대로 들어가있는 것을 확인할 수 있었습니다.

단순히 쿼리를 날리면서 디비에 있는 값이 모두 삭제되는 현상은 아닌 것 같은 게, team.teamname처럼 team의 상태필드를 셀렉트해오는 쿼리문을 날리면, 정상작동되며 디비의 값도 사라지지 않습니다. 대체 어떤 이유 때문에 컬렉션 값 연관 필드를 타고 들어가면 디비의 값이 사라지는 건가요?

  1. select team.teamName from Team t 하는 경우

package jpql;

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

import java.util.List;

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{
            Team team = new Team();
            team.setTeamName("team1");
            em.persist(team);

            Member member = new Member();
            member.setUserName("raewoo");
            member.setAge(10);
            member.changeTeam(team);
            em.persist(member);

            em.flush();
            em.clear();

            System.out.println("=============");

            String sql = "select t.teamName from Team t";
            String result = em.createQuery(sql, String.class)
                    .getSingleResult();

            System.out.println(result);

            tx.commit();
        }catch (Exception e) {
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}
스크린샷 2024-07-13 18.48.00.png스크린샷 2024-07-13 18.46.56.png
  1. select t.members.size from Team t하는 경우

package jpql;

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

import java.util.List;

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{
            Team team = new Team();
            team.setTeamName("team1");
            em.persist(team);

            Member member = new Member();
            member.setUserName("raewoo");
            member.setAge(10);
            member.changeTeam(team);
            em.persist(member);

            em.flush();
            em.clear();

            System.out.println("=============");

            String sql = "select t.members.size from Team t";
            Integer result = em.createQuery(sql, Integer.class)
                    .getSingleResult();

            System.out.println(result);

            tx.commit();
        }catch (Exception e) {
            tx.rollback();
        }finally {
            em.close();
        }
        emf.close();
    }
}
스크린샷 2024-07-13 18.51.30.png스크린샷 2024-07-13 18.51.36.png

답변 2

0

y2gcoder님의 프로필 이미지

2024. 07. 15. 09:14

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

제가 봐도 예외 때문에 rollback 이 발생하여 생기는 문제로 보입니다 🙂 먼저 catch 문 안에 println 문으로 예외 내용을 출력해보시고 이를 바탕으로 문제를 해결해보시거나, 추가 질문을 주시면 저희가 도와드릴 수 있을 것 같습니다!

감사합니다.

0

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

2024. 07. 13. 19:04

느낌상 쿼리문을 날릴 때 디비에서 값이 삭제된다기보다는, 쿼리문과 그 실행단계에서 어떤 오류가 있어서 tx.commit까지 도달하지 못해서 디비에 create가 안되는 것 같은데.. (persistence.xml에서

<property name="hibernate.hbm2ddl.auto" value="create" />

로 해놨습니다)

쿼리문을 작성하는 데 어떤 문법적 오류가 있나요? 근데 왜 오류메시지가 안 떴을까요..?ㅠㅠ

hibernate의 어떤 버그인가요?ㅜㅜ