category에 연관관계 편의 메서드 만드실 때 public void addChildCategory ( Category child){ this . child . add (child) ; child . setParent ( this ) ; } 이렇게 만드셨는데.. public void setParent ( Category parent) { this . parent = parent ; parent . getChild () . add ( this ) ; } 이렇게 만들어도 되는거죠? 만약 된다면 왜 첫번째 처럼 만드셨는지 궁금합니다.. 항상 잘 듣고 있습니다!
List<ProjectionResult> fetch = queryFactory .select( new QProjectionResult(classA.id , classA.relStatus.stringValue() , classA.relResult.stringValue() , classA.name , )) .from(classA) .join(classA.classB , classB).fetchJoin() .join(classB.classC , classC).fetchJoin() 안녕하세요. 위와 같이 join fecth와 queryprojection을 같이 사용하는 예제에서 실행하면 Caused by: org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list [FromElement{explicit,not a collection join,fetch join,fetch non-lazy properties, 와 같은 예외를 발생시킵니다. select(new QProjectionResult)가 아닌 select(classA)를 하면 정상적으로 결과가 처리되는데 어떤 차이가 있고 어떻게 해결을 해야 할까요 ? 감사합니다.
package study.querydsl.repository ; import org.junit.jupiter.api. AfterEach ; import org.junit.jupiter.api. BeforeEach ; import org.junit.jupiter.api. Test ; import org.springframework.beans.factory.annotation. Autowired ; import org.springframework.boot.test.context. SpringBootTest ; import org.springframework.test.annotation. Rollback ; import org.springframework.transaction.annotation. Transactional ; import study.querydsl.entity.Member ; import javax.persistence.EntityManager ; import javax.persistence. PersistenceContext ; import java.util.ArrayList ; import java.util.List ; @SpringBootTest @Transactional @Rollback ( false ) class MemberRepositoryTest { @PersistenceContext private EntityManager em ; @Autowired private MemberRepository memberRepository ; @Test public void test () throws InterruptedException { List<Member> members = makeList() ; for (Member member : members) { test1(member.getId()) ; Thread. sleep ( 1000 ) ; } } private List<Member> makeList () throws InterruptedException { List<Member> members = new ArrayList<>() ; for ( int i = 0 ; i < 20 ; i++) { Member member = new Member( "gon " + i , i) ; members.add(member) ; } memberRepository .saveAll(members) ; em .flush() ; //<--- insert query 는 생성되나 db 에는 아직 없음 . Thread. sleep ( 5000 ) ; return members ; } protected void test1 (Long id) { Member member = memberRepository .findById(id).get() ; member.setUsername( "Park" ) ; memberRepository .save(member) ; em .flush() ; //<--- update query 는 생성되나 db 에는 아직 없음 . } } 안녕하세요 위와 같은 예제에서 makeList 메소드에서 생성된 리스트를 실 db에 insert를 하고 각 리스트 아이템을 처리하는 test1 메소드에서 처리된 아이템을 insert 를 하고 싶은데 em.flush를 해도 insert, update 쿼리만 발생되고 db에는 아직 결과가 들어오지 않고 test가 완전히 종료가 되는 순간 db에 값이 들어온것으로 확인 됩니다. 이를 해결하기 위해서 class에 @transactional 을 제거하고 test1 메소드에 @Transactional을 붙이니 의도한대로 makelist에서 리스트 결과가 한번 db에 저장되고 test1 메소드에서 처리된 결과도 순차적으로 db에 인서트 되는것으로 확인 했으나 연관관계가 존재하는 경우 fetch lazy 동작이 no session으로 안되던데 이를 해결하는 방법이 있는지요. 질문을 정리하면 1. Transactional 중간에 db에 값을 쓰는 방법이 있는지. 2. class에서 @Transactional을 제거 하고 test1에 @Transactional을 붙이면 연관관계 fetch lazy가 동작을 하지 않는 이유가 무엇인지 (제가 이해를 했을땐 test1 부터 영속성 컨텍스트가 관리되어 이후 메소드 호출부터는 transaction이 걸려서 fetch lazy가 동작될거라고 예상했습니다. ) 친절하고 자세한 답변 늘 감사드립니다.
안녕하세요. 선생님 벌크연산 강의 중에 질문이 있습니다. JPA 프로그래밍 책에서 JPQL 실행 시 플러시가 자동 호출되어서 영속성 컨텍스트에 있는 쿼리문이 db에 동기화 되는걸로 알고 있는데 벌크 연산은 update 쿼리이기 때문에 자동으로 플러시가 호출되지 않아서 강제로 플러시를 호출해줘야 되는건가요? 이 부분에 혼동이 있어서 질문드립니다.
[리뉴얼] 파이썬입문과 크롤링기초 부트캠프 [파이썬, 웹, 데이터 이해 기본까지] (업데이트)
안녕하세요. 끝까지 수강하기위해 노력중인 수강생이에요.. 마지막갈수록 어려워지는건 기분탓일까요.. Open API를 사용해서 랭킹, 제목, 링크까지 뽑아내는건 성공했습니다. 그런데 동영상 13분 30초에서도 보면 title로 뽑아낸 자료들에 전부 <b> </b> 태그가 붙는데 이 태그를 없애는 방법이 따로 있나요? 전에 썼던것 처럼 get_text 이런걸 써주면 해결되는 부분인가요? 제가 나름대로 get_text 를 써서 리스트 안에 넣어봤는데 안되더라구요. 어찌해야할까요?
안녕하세요 강사님. 동등성 비교를 할 경우 값타입과는 다르게 엔티티의 관계에서는 ManyToOne 과 같은 연결관계가 있는경우 서로가 서로의 equals를 호출하는 경우가 있는데 이를 해결하기 위해 강사님께서 선호하는 방식이 있는지 알고 싶습니다. 저의 생각은 ManyToOne과 같은 비교가 있는경우 그 필드를 제외하는 것이 낫지 않을까 싶었습니다. 이유는 1. 동등성은 @Id로도 충분하지 않을까 하는 생각. 2. Team의 동등성을 꼭 체크하지 않아도 Team의 동등성은 Team을 따로 빼서 해도 되지 않을까 (하지만 이것도 생각해보면 Team의 동등성을 따로 검사해야 하나 라는 생각이 듭니다.) 이었습니다. 강사님은 어떻게 생각하시는지 궁금합니다.
안녕하세요 도사님 그 동안 JPA 강의 올려주신것 모두 (회사의 지원을 받아)잘 봤습니다. final JPAQuery < Long > countQuery = queryFactory .select (gcm . memberId .count ()) .from (gcm) .join (gcm . member , member) .where (member . dropDt .isNull () , gcm . adId .isNotNull () , gcm . adId .isNotEmpty ()) .groupBy (gcm . memberId ) .having (gcm . adId .count () .eq ( 1L )) ; return PageableExecutionUtils. getPage ( content , pageable , () -> countQuery .fetchCount ()) ; return PageableExecutionUtils. getPage ( content , pageable , () -> countQuery .fetch () .size ()) ; 위 코드는 스프링 JPA를 활용한 QueryDSL 부분에 나오는 도사님의 코드를 참고(복사)하여 만든 코드입니다. 저는 fetchCount()를 사용하고 싶지만 fetchCount()나 fetchResults()를 사용하면 아래와 같은 에러가 발생하여 어쩔 수 없이 fetch()를 사용하고 있습니다. groupby having 절을 사용 할 때만 fetchCount()나 fetchResults()를 사용하면 에러가 발생하는 것 같습니다. Caused by: org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: having near line 5, column 1 [select count(distinct gcm.memberId) from com.neibus.admin.fcm.repository.Gcm gcm inner join gcm.member as member1 where member1.dropDt is null and gcm.adId is not null and not length(gcm.adId) = 0 having count(gcm.adId) = ?1] 버그인가 싶다가도 이런 버그가 있었다면 강의 내용중에 언급하셨을거라는 생각에 제가 잘못한거라 믿고 도사님께 기대 봅니다. 혹시 제가 잘못한 부분이 있는 건지 아니면 groupby having 절을 사용하면 fetch()만 사용할 수 있는건지 궁금합니다.
안녕하세요. from절의 서브쿼리 해결방안으로 애플리케이션에서 쿼리를 두 번 분리해서 실행하라고 하셨는데, 이 말씀이 첫 번째 쿼리로 인라인 뷰에 해당하는 결과리스트를 구하고 이 결과를 두 번째 쿼리의 from절이나 join절에 테이블(뷰) 형식으로 넣을 수 있다는 말씀이신지요?
안녕하세요 새해복 많이 받으세요:) 더자바 완강 후 메모리구조에 대해 다시 스터디하고 있습니다. 그러던 중 java8 부터 바뀐 metadata space 에 대해 알게 되었는데요, 힙 영역과 분리되어있고 메타데이터(클래스 이름, 메서드 정보 등)을 담고 있는 걸로 확인했습니다. 더자바 강의에서 메모리의 메서드 영역에 클래스 수준의 정보(풀패키기 경로, 메서드 이름, 변수 명 등)를 담는걸로 학습했던 기억이 있어 두 개념의 차이점을 알고 싶어 질문 남깁니다. 좋은 강의 올려주셔서 감사합니다!
안녕하세요. '주문 도메인 개발 - 주문 기능 테스트' 강의 마지막 부분에서 DB와 상관없이 단위 테스트를 해보는 것도 중요하다라고 언급을 해주셨는데요. 강의를 듣고 이해한 단위 테스트라는 것은 JPA를 이용하는 문법(Service, Repository)까지 테스트 하지 않고, 엔티티 클래스(Order, OrderItem 등)에 선언된 비즈니스 로직 메소드만 가지고 잘 동작하는지 테스트 하는것을 의미하는 것인가요? 예를 들어, '주문 상품 재고 감소' 테스트 코드를 작성한다면, 초기값이 설정된 회원과 주문 상품 객체를 생성한 후 주문시 'Service,'와 'Repository'를 사용하지 않고 순수 엔티티 클래스에 정의된 비즈니스 로직 메소드가 잘 동작하는지 확인하는 코드를 작성하면 되는 것 일까요? 위 내용이 맞다면 단위 테스트의 대상은 아래와 같겠네요. OrderItem Class의 createOrderItem(), Order Classs의 createOrder(), Item Abstract Class의 removeStock() 미리 답변 감사드립니다.