월 18,150원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
merge
merge는 다음과 같이 동작해요1. 1차 캐시에서 엔티티를 찾는다2. 없으면 디비를 조회한다3. 찾아온 것에 값을 채운다 없으면 새로운 객체를 생성하고 거기에 값을 채운다4. 그리고 값을 반환한다근데 merge는 준영속을 영속화시킬때 사용하잖아요준영속인 개체가 1차캐시에 있을리 없지않나요? 1의 과정을 왜 거치는건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본키매핑-24:30
아래와 같이 에러가납니다.테이블 drop 치고 실행했을 때 입니다.사진과 같이 에러나는 이유가 뭐죠?Caused by: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "ID"; SQL statement:
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
영속 엔티티 동일성 보장해주는 코드가 어디에 있는지 궁금합니다
안녕하세요 영한님!!!동일성 보장을 애플리케이션 쪽에서 해주는 코드를 뜯어보고 싶은데 보이지가 않습니다package org.hibernate.internal; public class SessionImpl extends AbstractSessionImpl implements EventSource, SessionImplementor, HibernateEntityManagerImplementorSessionImpl 클래스를 보니까 Map<String, Object> 형태로 저장하기 때문에 동일성이 보장이 되는 걸까요??어느 부분에서 같다고 판별을 하는지 너무 궁금합니다!!!!제가 내린 결론은 MetamodelImpl 클래스에 entityPersisterMap 에서 판별을 하는 것 같습니다!! 수정 ----------------------- 친구가 이거 같다고 해서 이 클래스를 보니까 hascode equals 가 오버라이딩 되어 있었습니다.제가 이해한 바로는 이 entitykey 가 같은 객체를 반환하니까 동일성보장이 된다고 생각합니다.https://docs.jboss.org/hibernate/orm/3.2/api/index.html공식문서를 보니까 EntityKey 가 Serializale id 이 고윳값으로 구분하는 것 같습니다!!제가 이해한게 맞을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
setter를 private으로 바꾸거나 생성을 안 할때
현재 학습 중인 jpa와 조금 거리가 먼 질문인데요.Spring JPA를 가지고 토이 프로젝트를 진행하고 있는 와중에 문제가 생겨 질문 드립니다.강의에서 말씀 한 것처럼 처음 생성 할 때만 값을 지정하고 중간에 값을 변경하지 못하도록 setter없이 생성자로만 작업하다 발견한 부분인데..thymeleaf 에서 input 값을 받을 때 name으로 받고 있습니다.하지만 setter가 없으니 값을 null로 받는 상황이 나오는데 이럴 때 실무에선 어떻게 해결하나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persistence.xml 클래스 관련 문의
안녕하세요.이클립스에 객체를 추가할때마다 persistence.xml에 클래스를 매핑시켜줘야 하는데 하나씩 추가 매핑이 아닌 자동으로 매핑이 가능한지 여쭤보고 싶습니다!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
getFavoriteFoods() 질문
11분 10초 정도에 getFavoriteFoods()를 어떻게 할 수 있는건가요 get이라는건 값이 있는걸 가져오는 것 같은데 강의를 보면 set도 안해줬는데 어떻게 getFavoriteFoods를 할 수 있는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa에서는 같은 영속성 컨텍스트 레벨안에서 ==(instance of) 가 true가 나와야 하는 이유가 궁금합니다
(프록시 강의 26분~)안녕하세요영한님께서 jpa에서는 같은 영속성 컨텍스트 레벨 안에서 ==가 항상 true를 보장한다고 하셨는데,이 부분이 잘 이해가 되지 않습니다.em.find( = m1) 후 em.getReference( = m2)em.find하면 영속성 컨텍스트에 실제 member가 저장되니까 em.getReference를 하면, 껍데기를 만들고, 영속성 컨텍스트에 실제 entity값을 DB에서 가져다 달라고 요청하려 하는데, 이미 1차 캐시에 entity가 존재해서 em.getReference를 해도 m1 == m2가 성립하는 것으로 이해했습니다. em.getReference 후 em.getReferenceem.getReference => 프록시 객체 반환이때 프록시 객체를 초기화하는 과정에서 영속성 컨텍스트에 실제 entity를 저장할텐데, 다시 em.getReference를 하면 1차 캐시에 있는 entity를 사용하면 될텐데,왜 껍데기를 만들면서 프록시를 유지하는지 궁금합니다. em.getReference 후 em.findem.getReference => 프록시 객체 반환em.getReference에서 프록시를 초기화하는 과정에서 위와 같이 1차 캐시에 entity가 저장될텐데,왜 껍데기를 만들면서 프록시를 유지하는지 궁금합니다. 위의 3가지 예제를 보니, 여러 과정들을 거쳐 결국 jpa는 같은 영속성 컨텍스트 안에서 ==가 항상 true를 보장되는지, 아니면 true를 먼저 보장하기 위해서 다른 과정들을 끼워 맞추는지 궁금합니다. 여러 과정 => 결국에 모두다 ==가 보장됨or 모두 다 ==를 보장해야함 => ==가 true가 나오도록 끼워 맞추자. 마지막으로 jpa가 같은 영속성 컨텍스트 레벨에서 어떻게 ==를 true로 보장해주는지도 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find(Member.~ 이부분에서
Member findMember = em.fin(Member.class, primaryKey --> 요 primary key 부분이 전 o: 로 대체되는데 어떻게 해야 primarykey 로 바뀔까요?? 인텔리제이 쓰고 있습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
6분 47초에 왜 업데이트 쿼리가 2번 나가는지 궁금합니다!
값이 변경되는건 1개인데 쿼리는 왜 2개나가는지 이해가 잘 되지않습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
인텔리제이 무료버전을 사용해서 그런데
period같은 객체를 member에 작성할 때 @Embeddable을 사용해야 오류가 안난다고 나와있는데team같은 객체는 member에 작성할 때 many to one같은 어노테이션을 작성해서 오류가 안나는 건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
json column type 문의
실 사용중에 질문이 있어서 문의드립니다.db column 타입이 json으로된 컬럼의 경우 querydsl 사용시에 해당컬럼을 where절에 사용하는방법이 없을까요?.like , .eq 기능을 사용하고 싶은데 잘안되네요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
구현 클래스마다 테이블 전략 질문
30븐 10초 쯤에 아이템 아이디가 5번인것으로 예를 들어주셔서 아이템 id가 5번인 table을 모두 다찾는다고 했는데 이해가 되지 않습니다.em.find를 할때 클래스를 넣어주는데 왜 table을 모두 다 찾나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA 질문입니다.
안녕하세요 김영한님! 다름이 아니라 김영한님 JPA책을 읽으면서 궁금한게 생겨서요.db read commtied + JPA 1차 캐시를 사용하면 repeatable read가 가능한데 JPA 락은 더 높은 격리 수준이 필요하면 건다고 하셨는데 serializable 격리 수준이 필요하면 해결 할 수 있는 락이 없는데 JPA 락을 왜 쓰는지 모르겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.find()와 영속성 컨텍스트 관련 질문
안녕하세요!em.find()와 영속성 컨텍스트 관련해서 학습테스트를 작성하던 도중 의문이 생겨 질문을 남깁니다.em.find() 작업은 1차 캐시에 데이터가 존재한다면 영속성컨텍스트의 데이터를 반환하고, 1차 캐시에 데이터가 존재하지 않을 경우 DB에 select 쿼리문을 보내는 것으로 알고 있습니다. 위 선행지식을 바탕으로, 아래의 학습테스트 경우처럼 1차 캐시가 비어있고 DB에 데이터가 있는 경우에서 delete 메서드를 호출하고 EntityManager를 flush()하지 않은 상태로 테스트하여 delete 쿼리문을 DB에 보내지 않고 쓰기지연 저장소에 남겨둔 상태를 테스트해보도록 했습니다.(여기서 delete는 Spring Data JPA의 delete문입니다! 이 delete 메서드에선 해당 JpaRepository의 구현체를 타겟 프록시로 하는 SimpleJpaRepository에서 em.find() 작업 후 em.remove() 작업을 해주는 것으로 알고 있습니다.)학습 테스트 @Test @DisplayName("1차 캐시가 비어있고 쓰기지연 저장소에 delete 쿼리가 있는 상태에서 em.find()를 할 경우 결과를 확인한다") void test7() { // 영속성 컨텍스트, DB에 모두 member 저장 (IDENTITY 전략) final Member member = new Member("kth990303", "kth990303@naepyeon.com", Platform.KAKAO, "1"); final Long memberId = memberRepository.save(member) .getId(); // 영속성 컨텍스트는 비워줌 em.flush(); em.clear(); System.out.println("==========================="); // delete 쿼리는 쓰기지연저장소에 존재하고 아직 sql로 찌르지는 않음 memberRepository.delete(member); System.out.println("============================================="); // 1차캐시에 Member는 존재하지 않으므로 select 쿼리가 이 때 나갈 줄 알았으나 안나감. em.find(Member.class, memberId); em.flush(); em.clear(); }저는 위 테스트에 대한 결과 예측을 아래와 같이 했습니다.insert문을 DB에 날린다이후 em.clear()로 영속성 컨텍스트를 비워주어 1차 캐시에는 데이터 존재 X======delete 메서드 호출한다. 1차 캐시에 데이터가 존재하지 않아 select 쿼리문 후 delete 쿼리문을 날려야 함. (SimpleJpaRepository) 이 쿼리문들은 쓰기지연 저장소에 저장돼서 아직 날라가지 않음.=======em.find()를 호출하고, 1차 캐시에 데이터가 존재하지 않아 select 쿼리문이 쓰기지연저장소에 쌓임.em.flush()를 해주어 쓰기지연저장소에 있던 select, delete, select가 나갈 것이라 예측.결과적으로 insert -> ==== -> ===== -> select, delete, select 가 나갈 것이라 생각했습니다.하지만 실제 쿼리는 아래와 같았습니다.실제로는 위와 같이 insert -> ==== -> select -> ===== -> delete 만 나가게 됐습니다.이에 대한 이유가 궁금합니다!감사합니다. 참고1. SimpleJpaRepository의 delete 메서드@Override @Transactional @SuppressWarnings("unchecked") public void delete(T entity) { Assert.notNull(entity, "Entity must not be null!"); if (entityInformation.isNew(entity)) { return; } Class<?> type = ProxyUtils.getUserClass(entity); T existing = (T) em.find(type, entityInformation.getId(entity)); // if the entity to be deleted doesn't exist, delete is a NOOP if (existing == null) { return; } em.remove(em.contains(entity) ? entity : em.merge(entity)); }참고2. 해당 질문에 대한 상황을 정리한 노션https://clean-nutria-44b.notion.site/JPA-em-find-1-34fa1ba3df914e24ba9dd9a143f28c8c
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL 문법 RollBack
JPQL 작성 시, 전체 조회하면 이상이 없는데 특정 칼럼을 지정하면 RollBack에러가 발생합니다. 어떤 문제인지 알고 싶습니다..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
fetch join 일관성에 관하여 질문입니다.
안녕하세요 영한님올려주시는 강의를 들으며 JPA를 공부하고 있습니다.JPA에서 fetchJoin에 관련해서 질문을 검색해보다가 아래 링크에 있는 글을 봤습니다.https://www.inflearn.com/questions/59632다행히 해당 링크에서 영한님이 말씀해주신, fetchJoin에서 조인 대상의 필터링을 지원하지 않는다는 내용과 일관성이 깨질 수 있다는 내용은 이해를 했습니다.그런데 써주신 내용 중 이해가 안가는 부분이있습니다.아래는 영한님이 답변한 글 입니다. 댓글 번호는 5번입니다왜냐하면 JPA의 엔티티 객체 그래프는 DB와 데이터 일관성을 유지해야 하기 때문입니다.예를 들어서 DB에 데이터가 다음과 같이 있습니다.team1 - memberAteam1 - memberBteam1 - memberC그런데 조인 대상의 필터링을 제공해서 조회결과가 memberA, memberB만 조회하게 되면 JPA 애플리케이션은 다음과 같은 결과로 조회됩니다.team1 - {memberA, memberB}team1에서 회원 데이터를 찾으면 memberA, memberB만 반환되는 것이지요.이렇게 되면 JPA 입장에서 DB와 데이터 일관성이 깨지고, 최악의 경우에 memberC가 DB에서 삭제될 수도 있습니다.왜냐하면 JPA의 엔티티 객체 그래프는 DB와 데이터 일관성을 유지해야 하기 때문입니다! 잘 생각해보면 우리가 엔티티의 값을 변경하면 DB에 반영이 되어버리지요.위에 내용중 "이렇게 되면 JPA 입장에서 DB와 데이터 일관성이 깨지고, 최악의 경우에 memberC가 DB에서 삭제될 수도 있습니다." 이게 기존에 DB에 존재하는 데이터가 삭제될 수 있다는 내용으로 이해했는데 어떤 상황에서 발생할 수 있을까요?? 코드로 재연해보려고 시도했는데 계속 막히고있습니다ㅜㅜ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
값타입
35강 값타입 불변객체 강의중,처음 new Address로 인스턴스를 찍어내고두번째 new Address 는 그전 주소를(메모리)참조하여 생성하는데,member 객체를 생성할때 마다 새로운 Address 를 찍어내면 안되나요?그러면 두개의 member 가 있을때 하나의 값을 변경해도각자 다른 주소를 바라보고 있으니 통합변경이 일어나지 않는거 아닌가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team.getMembers().add(member) 관련 질문드립니다
안녕하세요.team.getMembers().add(member) 실행시, 메모리에 team 관련하여 저장이 되고,Team findTeam = em.find(Team.class, team.getId()));실행시, 1차 캐시 (메모리)에서 team을 가져오는데,이 두가지 모두 같은 메모리에서 같은 team을 가져오는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블에는 객체가 못들어가나요?
Member 클래스에는 team이라는 클래스가 있는데db를 확인해보니 team_id로 되어있어서요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Order entity에서 private Long memberId; 를 지우면 memberId를 통한 select 쿼리는 못 날리게 되는거죠?
Order entity에서 private Long memberId; 를 지우면 memberId를 통한 select 쿼리는 못 날리게 되는거죠?예를 들어 member1 (id = 1)이 주문한 모든 order를 조회하고 싶을 때 select * from orders where member_id = 1이런식으로 order 레코드들을 찾을텐데매핑을 하면 이런 쿼리는 안날리고 member1.getOrders() 이런식으로 list를 받는 메소드를 사용하는거죠?