월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
hibernate 6 부터는 항상 distinct 가 적용된다고 합니다. 따라했는데 결과가 다르게 나와서 한참 해맸네요
원문입니다.DISTINCTStarting with Hibernate ORM 6 it is no longer necessary to use distinct in JPQL and HQL to filter out the same parent entity references when join fetching a child collection. The returning duplicates of entities are now always filtered by Hibernate.Which means that for instance it is no longer necessary to set QueryHints#HINT_PASS_DISTINCT_THROUGH to false in order to skip the entity duplicates without producing a distinct in the SQL query.From Hibernate ORM 6, distinct is always passed to the SQL query and the flag QueryHints#HINT_PASS_DISTINCT_THROUGHhas been removed.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
team이 존재하지않는 member가 존재할때 nullpointerExc
Team team = new Team(); team.setName("TeamA"); em.persist(team); Team team2 = new Team(); team2.setName("TeamB"); em.persist(team2); Member member1 = new Member(); member1.setUsername("회원1"); member1.setTeam(team); em.persist(member1); Member member2 = new Member(); member2.setUsername("회원2"); member2.setTeam(team); em.persist(member2); Member member3 = new Member(); member3.setUsername("회원3"); member3.setTeam(team2); em.persist(member3); Member member4 = new Member(); member4.setUsername("회원4"); member3.setTeam(null); em.persist(member4); em.flush(); em.clear(); List<Member> lazyLoadingResult = em.createQuery("select m from Member m ", Member.class).getResultList(); for (Member member : lazyLoadingResult) { System.out.println("member = " + member.getUsername() + ", " + ((member.getTeam().getName() == null) ? "null" : member.getTeam().getName())); }위와 같이 team이 존재하지 않는 Member 데이터를 추가한 뒤에 inner join을 하게될 경우nullpointerException이 발생합니다.객체 탐색을 활용하면 발생하게 되는 문제로 이해는 했지만 JPQL을 사용하였을 때 이에 대한 해결책으로는 어떤 게 있을까요?3항연산자로 사용 처리를 해보려고 하였으나 객체 탐색이기 때문에 처리가 되지 않고 있습니다.case문을 활용할 수 밖에 없을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
교재 구매 문의
안녕하세요. jpa 강의 듣고있는데요 jpa교재도 있더라구요. 근데 그 책이 좀 오래된것 같은데 지금 구매해도 상관없을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
프로젝션 임베디드 타입(Address) 쿼리호출 안되는 문제
아래와 같이 쿼리를 구성했는데select쿼리가 나가지 않습니다.어디가 잘못되었는지 궁금합니다..//임베디드 타입 프로젝션(Address) Address address = new Address(); address.setCity("경기도 땡땡"); address.setStreet("땡땡동"); address.setZipcode("00000"); Product product = new Product(); product.setName("제발되라"); em.persist(product); Order order = new Order(); order.setOrderAmount(0); order.setAddress(address); order.setProduct(product); em.persist(order); em.flush(); em.clear(); em.createQuery("select o.address from Order o", Address.class) .getResultList(); 아래와 같이 mapped가 안됬다고 오류가 뜹니다..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
print 출력이 안돼요
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.print 행만 제대로 컴파일이 안되는 것 같은데 왜 그런걸까요... Hibernate: drop table if exists Member cascade Hibernate: drop table if exists Team cascade Hibernate: drop sequence if exists Member_SEQHibernate: drop sequence if exists Team_SEQ6월 16, 2023 6:58:10 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@404eca05] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.Hibernate: create sequence Member_SEQ start with 1 increment by 50Hibernate: create sequence Team_SEQ start with 1 increment by 506월 16, 2023 6:58:10 오후 org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnectionINFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@4832f03b] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.Hibernate: create table Member ( Team_ID bigint, id bigint not null, USERNAME varchar(255), primary key (id) )Hibernate: create table Team ( TEAM_ID bigint not null, USERNAME varchar(255), primary key (TEAM_ID) )Hibernate: alter table if exists Member add constraint FKknpbqg06nqr85nxx8lcw476y0 foreign key (Team_ID) references Team6월 16, 2023 6:58:10 오후 org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase beforeScriptINFO: HHH000476: Executing script '[injected ScriptSourceInputNonExistentImpl script]'Hibernate: select next value for Team_SEQHibernate: select next value for Member_SEQHibernate: /* insert for hellojpa.Team */insert into Team (USERNAME,TEAM_ID) values (?,?)Hibernate: /* insert for hellojpa.Member */insert into Member (Team_ID,USERNAME,id) values (?,?,?)Hibernate: select m1_0.id, t1_0.TEAM_ID, t1_0.USERNAME, m1_0.USERNAME from Member m1_0 left join Team t1_0 on t1_0.TEAM_ID=m1_0.Team_ID where m1_0.id=?6월 16, 2023 6:58:11 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]Process finished with exit code 0
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속성 컨텍스트 에러 질문
안녕하세요 스프링 부트 환경에서 JPA 를 쓸때 이해하지 못하는 에러가 나서 질문합니다.현재 서비스와 레포지토리 레이어를 분리해서 사용하고 있고, @Transactional 어노테이션은 레포지토리 클래스에만 적용해 놓은 상태입니다.우선 save 함수와 findOne 함수는 이런식으로 존재합니다.public void save(Lost entity) {em.persist(entity);} public Optional<Lost> findOne(Long id) {return Optional.ofNullable(em.find(Lost.class, id));} Lost 엔티티는 이런식으로 존재합니다 (더 많은 컬럼이 있지만 필요한 것만 적었씁니다)@Data @Builder @AllArgsConstructor @NoArgsConstructor @Table(name = "lost") @Entity @JsonIgnoreProperties({"organization", "postCodeType"}) public class Lost { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "lost_id") private Long id; @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "lost_user_id", referencedColumnName = "user_id", insertable = false, updatable = false) @EqualsAndHashCode.Exclude @ToString.Exclude private User user; }근데 서비스 레이어에서 Lost result = lostsRepository.save(LostMapper.INSTANCE.toEntity(lostRequest)); System.out.println(lostsRepository.findOne(result.getId()).get().getUser());이런식으로 findOne을 해서 user 필드를 가져오려고 하면 null 이 뜹니다ㅠㅠ@ManyToOne(fetch = FetchType.EAGER)이 설정도 잘 해줬고, 커밋도 레퍼지토리에서 해서 그러면 user 필드가 채워져서 와야 할텐데 이해가 안됩니다..ㅠ @ToString.Exclude 문제는 아닌게 getUser 을 해서 봤을때도 null 이 뜹니다. 혹시 뭐가 문제일까요? findOne을 쓰는 다른 곳에서는 잘 동작하는데, 저렇게 save 를 한 직후에 save 한 엔티티 아이디로 findOne을 하면 조인한 다른 객체가 null로 뜹니다. 추가로 우선 해당문제는public void save(Lost entity) {em.persist(entity); em.flush(); em.refresh(entity); }이런식으로 바꿔서 해결했습니다.메커니즘이 이해가 안가서 질문드립니다!!감사합니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
트랜잭션 커밋시 영속 컨텍스트, 그리고 트랜잭션 커밋과 종료의 차이
트랜잭션이 커밋이 일어나면 영속 컨텍스트가 어떻게 되는지 궁금해서 질문드립니다. 비슷한 질문이 있어 해당 글의 답을 보니, "커밋되는 시점에는 영속성 컨텍스트를 삭제한다."라고 되어있습니다.그런데 어떤 블로그 글에서는 커밋되더라도 영속 컨텍스트의 1차 캐시는 남아있고, 쓰기 지연 SQL 저장소의 내용은 사라진다고 되어있습니다.Q1. 정확히 어떻게 되나요? 그리고 "컨텍스트의 삭제"의 정확한 의미가 이해가 되지않아서 이 부분도 궁금합니다!Q2. 영속 컨텍스트 자체가 삭제되는거라면, 커밋될 때 영속 컨텍스트의 삭제와 엔티티 매니저를 close()할 때 영속 컨텍스트가 닫히는것의 차이가 무엇인지 궁금합니다!Q3. 그리고 트랜잭션 커밋과 종료의 차이가 무엇인지 궁금합니다.찾아보니 "COMMIT을 수행하면 하나의 트랜잭션 과정을 종료하는 것이다"라고 봤는데, 워딩의 차이이지 결국 같은 의미인가요? 아니면 커밋하지않고 트랜잭션이 종료될 수 도 있는건가요?감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
영속 컨텍스트에서 flush가 발생하는 위치 혹은 순서
3강 영속성 관리를 공부하다가 flush에 관해 궁금한게있어 질문남깁니다.3강 강의자료에서 21페이지를 보시면 트랜잭션이 커밋될 때, flush가 발생하는것을 설명하면서 '2.flush'가 영속 컨텍스트에서 DB를 향하고있습니다. 그런데 23페이지 변경감지에서 flush가 발생하는것을 설명할때 그림을 보면, '1.flush()'가 바깥에서 영속 컨텍스트를 향하고있고, '4.flush'가 쓰기 지연 SQL 저장소에서 DB를 향하고있습니다. Q1. 전자(21페이지)는 flush가 한 번 발생하는데, 후자(23페이지)는 두 번 발생합니다. 둘 다 커밋할 때 발생하는건데 왜 차이가있는지 궁금합니다. 사실상 후자처럼 두 번 발생하는게 맞다고 보면 되나요? Q2. 변경감지 설명에서의 '1.flush()'가 바깥에서 영속 컨텍스트를 향하고있습니다. 이는 변경감지에서 가장 먼저 flush()가 발생한것인데, flush는 쿼리를 날리며 "영속성 컨텍스트의 변경내용을 데이터 베이스에 반영"하는것이라고 배웠습니다. 그럼 결국 더티체킹이 일어나기 전, 쿼리가 처음부터 날라가는건가요? 그렇다면 사실상 쿼리가 두 번 날라가는 건가요?아니라면 이 '1.flush()'는 뭔가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@JoinTable @JoinColum 옵션을 통한 외래키 선언 순서
M:N 관계를1:M과 M:1 관계로 풀어내는 @JoinTable 애노테이션의 옵션중joinColumns와 inverseJoinColumns를 지정하는 구분 기준은 따로 없고두개의 선언을 서로 다르게 선언해도 상관없나요??@JoinTable(name = "CATEGORY_ITEM" , joinColumns = @JoinColumn(name = "CATEGORY_ID") , inverseJoinColumns = @JoinColumn(name = "ITEM_ID") )@JoinTable(name = "CATEGORY_ITEM" , joinColumns = @JoinColumn(name = "ITEM_ID") , inverseJoinColumns = @JoinColumn(name = "CATEGORY_ID") 위와 같이 순서를 다르게 지정하면 JoinTable의 컬럼의 순서만 변경 되는것인가요?두 컬럼의 순서는 인덱스에만 영향을 줄 뿐 데이터 조회결과에는 영향을 미치지 않을거라 예상되는데 맞나요?따라서 다이어그램의 순서상으로 따진다면 CATEGORY_ITEM을 기준으로 ITEM테이블이 먼저 나오고 반대방향이 CATEGORY으로 이해하려고 하였으나 그 반대인거 같습니다.선생님께서 선언하신 순서는 어떤 기준대로 순서를 이해 해야 할까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Team엔티티의 members선언시 초기화 이유
ArrayList로 List 선언과 동시에 초기화 하는 이유에 대해서 왜 초기화를 하는지?어떤 예외상황을 대비해서 초기화를 하는지 궁금합니다.보통 마이바티스에서는 vo객체에 선언할 때 선언과 동시에 초기화 하지 않고 사용했던거 같아서 질문 드려요어떤 상황에서 add할때 null포인트가 뜨는지 궁금하네요직접 선언만 해놓고 초기화 하지 않고 add해봤는데 null포인트 오류는 발생하지 않고있어서 궁금합니다!!그리고 추가적으로 위와 같이 초기화할 수는 없는건가요?어차피 값이 세팅될 때는 getMembers에 의해서 members를 가져온 후에 add메소드를 통해 추가하는거니까 값을 추가할때만 초기화를 하도록 설정하면 안되는지요..?이렇게 해보면 결과적으로 값이 추가가 되지 않더군요... 그 이유도 잘 모르겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
CascadeType.ALL과 orphanRemoval=true를 함께 사용하는것에 대한 질문
안녕하세요영속성 전이와 고아객체에 대해 복습하다가 궁금증이 생겨 질문 올립니다. 영속성 전이는 부모 엔티티의 생명주기에 종속적인 자식 엔티티의 상태변화를 같이 처리해주는 것으로CascadeType.ALL 옵션은 부모 엔티티를 저장하거나 삭제, 변경 할 때, 자식 엔티티 역시 같이 저장하거나 삭제, 변경 해주는 걸로 알고 있습니다.그리고 orphanRemoval=true 고아객체는 부모 엔티티와의 관계가 끊어지면 자동으로 삭제되는 자식 엔티티를 의미한다고 하였습니다. 여기서 궁금증이 생겼습니다.CascadeType.ALL 를 설정하면 부모 엔티티가 자식 엔티티의 생명주기를 처리해주는데orphanRemoval=true 을 같이 사용해 자식 엔티티가 삭제되는 것이 중복될 텐데왜 이 두옵션을 같이 사용하는지 잘 모르겠습니다..검색을 해봐도 두 옵션을 같이 사용하는 경우에는부모 엔티티와 관계된 자식 엔티티의 생명주기를 부모 엔티티에서 한 번에 관리할 수 있다고 하는데어차피 CascadeType.ALL 옵션하나로 부모 엔티티가 자식 엔티티의 생명 주기를 관리하는데어떤 이유에서 같이 사용하는 건가요 ??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
@Embedded 유무 차이
Address에 @Embedded 붙히든 안붙히든 h2에 테이블에는 차이가 전혀 없는데 어떻게 이해해야 할까요? 쓰고 안쓰고의 차이가 뭘까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
블로그 기술
김영한 님의 강좌를 쭉 따라 공부중인데 뭔가 강의 소스를 블로그에 정리해도 될지 몰라서 노션에만 정리해놨는데요,..! 이직 준비하면서 꾸준함을 나타내고 싶어서 블로그에 차근차근 올려보려는데 어느정도 까지 올려도 되는지 궁금합니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
자막 관련 기능
안녕하세요 혹시 자막 관련 기능은 지원하지 않는지, 궁금합니다.청력이 좋지가 않아서 듣고는 있는데 약간 애로사항이 생기네요.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
설정 파일 관리 방법 질문(spring X)
기존 프로젝트(spring X)에 jpa를 적용하는 중인데, persistence.xml 파일로 설정 후Persistence.createEntityManagerFactory("test");호출 시 아래의 예외가 발생하는 이슈가 있습니다.java.lang.NoSuchMethodError: org.apache.xerces.impl.xs.XMLSchemaLoader.loadGrammar([Lorg/apache/xerces/xni/parser/XMLInputSource;)Vxml 파싱 중 프로젝트에서 사용중인 xerces...jar 파일과 jdk의 rt.jar가 충돌되어 메서드를 찾지 못하는 현상으로 파악중입니다. (일반적인 jpa 예제에서는 rt.jar를 참조해야하지만, 해당 코드에서는 xerces...jar를 참조함)해당 라이브러리를 걷어내기엔 기존 코드의 dependency가 염려되어 다른 파일(yml/properties)로 설정을 관리할 수는 없을까 싶은데, 검색 결과는 대부분 spring jpa 관련 내용이었습니다.jpa 설정 시 xml 파일이 아닌, yml 또는 properties 파일로 관리하는 방법이 있는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 매니저 프록시 역할
안녕하세요! 질문 좀 드리려고 합니다엔티티 매니저 프록시는 프록시를 싱글톤으로 주입해서 동시성 문제를 해결하고 실제 엔티티 매니저 인스턴스를 ThreadLocal로 관리하는 역할 정도로 생각해도 괜찮을까요?추가적으로 실제 엔티티 매니저는 @Transactional을 사용하면 JpaTransactionManager에서 생성이 되는데 @Transactional을 사용하지 않으면 처음 엔티티 매니저를 사용할 때 생성이 되나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
단건조회시 fetch를 이용했을때 쿼리개수와 성능이 궁금합니다.
long startTime = System.currentTimeMillis(); BoardResponse.Detail response = boardService.findBoard(board.getId()); long endTime = System.currentTimeMillis(); // then System.out.println(endTime - startTime);해당 코드에서 findBoard Service는 게시글의 힌트, 태그, 정답, 공감을 가져와 DTO의 변환을 거쳐 하나의 게시글을 단건조회하는 서비스입니다.다만 여러 케이스로 테스트했는데단순히 findById로 로직을 테스트를 하게되면 해당 findBoard는 60~90ms의 실행속도와 쿼리가 지연로딩으로 인해 5개가 나가지만JPQL을 통해 DTO를 직접 접근하는 식으로 바꿨을땐, 쿼리를 1개로 나가지만 실행속도가 250~290ms가 나오게 되는데 단건조회의 경우 fetchJoin이나 join+DTO 방식을 쓰는것보다 지연로딩이 있더라도 일반적인 findById를 사용하는것이 좋은지 여쭤봅니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 객체 생성시 생성자 방식 VS Builder() 패턴 방식
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]두 객체 생성 방식의 차이를 간단하게 비교해서 알아본 결과 Builder 패턴을 이용하면 가독성이 좋아져서 Builder 패턴을 이용해 객체를 생성하는 것이 좋다VSBuilder 패턴은 코드가 복잡해지고 생성자 보다 성능이 떨어지므로 생성자 방식으로 개겣를 생성하는 것이 좋다.위와 같은 결론을 얻었습니다.이렇게만 보면 코드를 작성하는 사람의 차이인거 같은데실제 현업에서는 어떤 방식을 주로 사용하거나 선호하나요 ??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 관계 까지 수업듣고 질문 드립니다. (fk를 pk설정)
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]예시로 드신 Member_Product 테이블의 관계는 주문 테이블이라고 이해가 되는데 이럴경우에는 fk 2개를 pk설정을 하면 중복된 값이 못들어와서 당연히 기본키를 하나 만들어 주는걸로 배웠는데 만약에 주문이 아니고 수강테이블처럼 중복된 값을 막아야 하는 경우에도 테이블 내에 pk를 하나더 만들어 주는게 맞을까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
jpa 영속성 컨텍스트 질문입니다.
em.persist(member1); em.persist(order1); em.persist(order2); em.flush(); em.clear(); <-- order1 내용 변경 --> em.persist(order1); tx.commit()flush와 clear까지 하면 db에 반영은 되어있고 order1의 내용을 조금 바꾼뒤 persist하면 1차 캐시에 올라가있을텐데, commit을 하면 실제 db에 아무것도 뜨지 않습니다.em.clear 주석 하고, 내용 변경 후 em.persist의 유무와 상관없이 db에 잘 반영이 됩니다.clear와 persist 사이의 무슨 관계가 있는 것 같은데, db에 아무것도 뜨지 않는 이유가 뭔가요?