team.members.size 쿼리 사용 시 디비 데이터가 삭제되는 현상
275
작성한 질문수 3
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.
1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)
질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)
[질문 내용]
여기에 질문 내용을 남겨주세요.
강의에 나온 대로 t.members.size를 가져오는 쿼리를 작성 후 실행해봤습니다. 하지만 결과가 나오지 않고, h2디비에 들어가서 값을 확인해보니 값이 모두 지워져있습니다. jpql쿼리를 작성하고 결과를 가져오는 코드를 주석으로 처리하고 돌려보면, 값이 제대로 들어가있는 것을 확인할 수 있었습니다.
단순히 쿼리를 날리면서 디비에 있는 값이 모두 삭제되는 현상은 아닌 것 같은 게, team.teamname처럼 team의 상태필드를 셀렉트해오는 쿼리문을 날리면, 정상작동되며 디비의 값도 사라지지 않습니다. 대체 어떤 이유 때문에 컬렉션 값 연관 필드를 타고 들어가면 디비의 값이 사라지는 건가요?
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();
}
}


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();
}
}
답변 2
0
안녕하세요. raewoo0908님, 공식 서포터즈 y2gcoder입니다.
제가 봐도 예외 때문에 rollback 이 발생하여 생기는 문제로 보입니다 🙂 먼저 catch 문 안에 println 문으로 예외 내용을 출력해보시고 이를 바탕으로 문제를 해결해보시거나, 추가 질문을 주시면 저희가 도와드릴 수 있을 것 같습니다!
감사합니다.
0
느낌상 쿼리문을 날릴 때 디비에서 값이 삭제된다기보다는, 쿼리문과 그 실행단계에서 어떤 오류가 있어서 tx.commit까지 도달하지 못해서 디비에 create가 안되는 것 같은데.. (persistence.xml에서
<property name="hibernate.hbm2ddl.auto" value="create" />로 해놨습니다)
쿼리문을 작성하는 데 어떤 문법적 오류가 있나요? 근데 왜 오류메시지가 안 떴을까요..?ㅠㅠ
hibernate의 어떤 버그인가요?ㅜㅜ
벌크연산에서 member.getAge 호출 시 영속성 컨텍스트에서 데이터를 가져오는건가요?
0
33
2
inheritance startegy 선택시 고려사항
0
24
1
Entity 동등성 비교
0
25
1
실무 조언 관련 질문입니다.
0
49
1
H2데이터베이스 파일 생성
0
60
2
서브쿼리 강의에서 ALL 예시 관련 질문드립니다.
0
57
2
수정또는 삭제시 영속성 엔티티에 값이 무조건 있어야 하나요?
0
58
1
JPQL 메소드와 락
0
57
1
Delivery @OneToOne
0
64
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





