월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 컬럼의 CamelCase 를 SnakeCase로 매핑해주는 옵션 확인
엔티티내에 컬럼 CamelCase 를 SnakeCase 로 변환해 쿼리하는 옵션이 이거인가요?spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
22:05초 실행 관련 질문이 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)22:05초 부분을 보면 Lazy 옵션으로 바꾸고 실행을 해보면 em.find() 로 team 클래스를 찾아보지 않았음에도 team 엔티티에 select 쿼리가 나가는데 왜 해당 쿼리가 발생하는지 궁금합니다. Team findTeam = findMember.getTeam() 을 통해 해당 Team 객체를 얻었으니까 select 쿼리가 나갈 필요가 없는 것 아닌가요?아니면 Team findTeam = findMember.getTeam()을 통해 얻은 해당 Team 객체는 조인을 통해 Id 값만 가지고 있는 비어있는 객체라 select 쿼리가 추가적으로 나가서 해당 객체의 필드값을 채워줘야하는 상태인가요? 만약 이게 맞다면 DB에 외래키가 저장될때는 Id값만 저장하고 다른 값들(name 필드 등등)은 다 날려버리고 저장하게 되는건지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의영상 5:53 // 로그기록이 다르게 뜹니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예[질문 내용]여기에 질문 내용을 남겨주세요. "C:\Program Files\Java\jdk-11.0.15\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.2\lib\idea_rt.jar=52585:C:\Program Files\JetBrains\IntelliJ IDEA 2022.3.2\bin" -Dfile.encoding=UTF-8 -classpath C:\ex1-helllo-jpa\target\classes;C:\Users\cookie\.m2\repository\org\hibernate\hibernate-entitymanager\5.3.10.Final\hibernate-entitymanager-5.3.10.Final.jar;C:\Users\cookie\.m2\repository\org\jboss\logging\jboss-logging\3.3.2.Final\jboss-logging-3.3.2.Final.jar;C:\Users\cookie\.m2\repository\org\hibernate\hibernate-core\5.3.10.Final\hibernate-core-5.3.10.Final.jar;C:\Users\cookie\.m2\repository\org\javassist\javassist\3.23.2-GA\javassist-3.23.2-GA.jar;C:\Users\cookie\.m2\repository\antlr\antlr\2.7.7\antlr-2.7.7.jar;C:\Users\cookie\.m2\repository\org\jboss\jandex\2.0.5.Final\jandex-2.0.5.Final.jar;C:\Users\cookie\.m2\repository\com\fasterxml\classmate\1.3.4\classmate-1.3.4.jar;C:\Users\cookie\.m2\repository\javax\activation\javax.activation-api\1.2.0\javax.activation-api-1.2.0.jar;C:\Users\cookie\.m2\repository\org\dom4j\dom4j\2.1.1\dom4j-2.1.1.jar;C:\Users\cookie\.m2\repository\org\hibernate\common\hibernate-commons-annotations\5.0.4.Final\hibernate-commons-annotations-5.0.4.Final.jar;C:\Users\cookie\.m2\repository\javax\persistence\javax.persistence-api\2.2\javax.persistence-api-2.2.jar;C:\Users\cookie\.m2\repository\net\bytebuddy\byte-buddy\1.9.5\byte-buddy-1.9.5.jar;C:\Users\cookie\.m2\repository\org\jboss\spec\javax\transaction\jboss-transaction-api_1.2_spec\1.1.1.Final\jboss-transaction-api_1.2_spec-1.1.1.Final.jar;C:\Users\cookie\.m2\repository\com\h2database\h2\1.4.199\h2-1.4.199.jar;C:\Users\cookie\.m2\repository\javax\xml\bind\jaxb-api\2.3.0\jaxb-api-2.3.0.jar hellojpa.JpaMain3월 01, 2023 11:29:32 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [ name: hello ...]3월 01, 2023 11:29:33 오후 org.hibernate.Version logVersionINFO: HHH000412: Hibernate Core {5.3.10.Final}3월 01, 2023 11:29:33 오후 org.hibernate.cfg.Environment <clinit>INFO: HHH000206: hibernate.properties not found3월 01, 2023 11:29:33 오후 org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>INFO: HCANN000001: Hibernate Commons Annotations {5.0.4.Final}3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: using driver [org.h2.Driver] at URL [jdbc:h2:tcp://localhost/~/test]3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {user=sa}3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: false3월 01, 2023 11:29:34 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>INFO: HHH000115: Hibernate connection pool size: 20 (min=1)3월 01, 2023 11:29:34 오후 org.hibernate.dialect.Dialect <init>INFO: HHH000400: Using dialect: org.hibernate.dialect.H2DialectHibernate: select member0_.id as id1_0_0_, member0_.name as name2_0_0_ from Member member0_ where member0_.id=?3월 01, 2023 11:29:35 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]Process finished with exit code 0 이렇게 출력이 되고 준영속 상태 영상 5:53초에 로그이고 강사님처럼 로그기록이 안뜨고 저는 위에 처럼 뜨는데, 어디가 잘못된지 모르겠습니다.package hellojpa; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.EntityTransaction; import javax.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 { //영속 Member member = em.find(Member.class, 150L); member.setName("AAAAA"); em.clear(); Member member2 = em.find(Member.class, 150L); System.out.println("================="); tx.commit(); } catch (Exception e) { tx.rollback(); } finally { em.close(); } emf.close(); } }
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
상속관계 오류
Book.javaItem상속관계에서 오류가 발생했습니다..
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
설정 오류
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.이렇게 오류가 나서 해결이 안되는데 방법이 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
OSIV의 트랜잭션과 영속성컨텍스트
OSIV의 옵션이 true 일때는 동작이 다음과 같다고 하셨습니다.클라이언트의 요청이 들어오면 서블릿 필터나, 스프링 인터셉터에서 영속성 컨텍스트를 생성한다. 단 이 시점에서 트랜잭션은 시작하지 않는다.서비스 계층에서 @Transeactional로 트랜잭션을 시작할 때 1번에서 미리 생성해둔 영속성 컨텍스트를 찾아와서 트랜잭션을 시작한다.서비스 계층이 끝나면 트랜잭션을 커밋하고 영속성 컨텍스트를 플러시한다. 이 시점에 트랜잭션은 끝내지만 영속성 컨텍스트는 종료되지 않는다.컨트롤러와 뷰까지 영속성 컨텍스트가 유지되므로 조회한 엔티티는 영속 상태를 유지한다.서블릿 필터나, 스프링 인터셉터로 요청이 돌아오면 영속성 컨텍스트를 종료한다. 이때 플러시를 호출하지 않고 바로 종료한다.즉 영속성 컨텍스트는 뷰 렌더링 범위까지 존재하나 트랜잭션이 존재하는것은 아니다. 하지만 영속성 컨텍스트가 존재하는데 트랜잭션이 존재하지 않는것이 신기해 GPT에게 한번 더 질문을 했더니 아래 사진과 같았습니다. '요청이 발생하면' 이라는 말이 애매해서 다시 질문한 결과 클라이언트에서 요청을 보낸때 라고 답변을 줬습니다.요약하면 HTTP 요청이 들어오면 트랜잭션이 바로 생겨나고 엔티티매니저도 그때부터 생성되는걸로 이해했습니다. OSIV 옵션이 켜져있으면 엔티티매니저 뿐아니라 트랜잭션도 범위가 더 커지는건지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
임베티드 타입에 대해 질문있습니다.
7분44초에 임베디드 타입에서 같은 객체를 사용하여 저장하고 setter를 통해서 값을 수정하게 되면 같은 객체의 인스턴스를 사용하기 때문에 값이 member1과 member2가 둘 다 바뀐다고 하셔서 제가 테스트를 해봤습니다.같은 메서드에서 member1과 member2를 같은 address 객체를 사용해서 저장한 건 똑같은데 다른 메서드에서 아래에 코드 처럼 member1을 찾아와서 city를 수정하니 member2는 수정이 안된 것을 확인하였습니다. 이것은 다른 트랜잭션을 사용하기 때문에 같은 인스턴스를 공유하고 있지 않은 건가요?Member member = em.find(Member.class, 1L); member.getHomeAddress().setCity("city");
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
즉시로딩과 지연로딩 N+1 관련 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]11:16초, N+1 문제는 즉시로딩에서 나타나는 문제라고하는데, 제가 알기론 지연로딩에서 나타나는 문제 아닌가요?? 어째서 즉시로딩일때 N+1 문제가 발생하는걸까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 생명주기 질문
안녕하세요 jpa 엔티티의 생명주기 공부를 하다 궁금한게 생겨 질문드립니다.JPA 기본편 3번 pdf 영속성관리의 10페이지 엔티티의 생명주기 그래프를 보면 removed 상태에서 flush() 를 해주면 DB에 반영되는것 같습니다.동일 pdf의 25번 페이지에는 플러시란 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는 것 이라고 되어있는데 그렇다면 removed 상태라는 것은 객체의 인스턴스는 메모리상에서 삭제되었지만 객체가 가지고 있던 데이터는 영속성 컨텍스트에 의해 관리되고 있다고 생각해도 되나요?removed 상태가 정확히 어떤 상태인지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
orphanRemoval=true, 고아 객체 질문
안녕하세요~findParent.getChildList().remove(0);강의에서 설명주신 위 코드에 대해 추가 질문이 있습니다.컬렉션에서 첫번째 child 엔터티를 제거한 경우에 고아 객체가 되어 delete 쿼리가 실행되는 것으로 이해를 했는데요.@OneToMany(mappedBy = "XXX", orphanRemoval = true)orphanRemoval만으로는 delete 쿼리가 실행되지 않고, cascade = CascadeType.PERSIST가 함께 실행된 경우에만 delete 쿼리가 실행되더라구요.@OneToMany(mappedBy = "XXX", orphanRemoval = true, cascade = CascadeType.PERSIST)혹시 orphanRemoval 설정만으로는 영속성 전이가 일어나지 않고 cascade = CascadeType.PERSIST을 추가해야지만, findParent.getChildList().remove(0); 호출시에 고아객체가 된 child 엔티티의 생명주기까지 영향을 미칠 수 있게 되어 delete 쿼리가 실행이 되는 것인지 여쭤보고 싶습니다.(즉, 'orphanRemoval'과 '영속성 전이' 설정을 독립적으로 봐야하는 것인지 궁금합니다.)감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
고아 객체 생성 조건
안녕하세요 영한님!질문드립니다. 고아 객체는 부모 엔티티와 연관관계가 끊어진 자식 엔티티 라고 이해했습니다.고아 객체가 생성되는 조건은부모 엔티티 삭제부모 엔티티가 삭제 되면 자식 엔티티를 고아객체로 판단 합니다.e.g) em.remove(parent); 부모 엔티티에 있는 자식 엔티티 컬렉션 제거연관관계가 끊어진 자식 객체를 고아객체로 판단 합니다.e.g) parent.getChild().remove(0); 결과적으로 orphanRemoval = true를 설정하면자식 엔티티(고아 객체)는 부모 엔티티와 함께 삭제 되거나자식 엔티티(고아 객체)만 삭제 된다. 맞게 이해하고 있는 것 일까요? 감사합니다.^^
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
DB설계
DB설계시, 되도록이면 join을 사용하지 않는 것이 더 나은지 궁금합니다attenshop - 관심 쇼핑몰buyer - 사용자shoppingmale - 쇼핑몰 이렇게 1.attenshop에 buyer와 shoppingmal둘다 join을 거는 것2.attshop과 buyer table에만 join을 걸고, attenshoptable에 shoppingmal 기본키 컬럼을 추가하는 것둘 중 어떤게 더 설계상 더 나을 지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
쓰기지연SQL저장소는 정말 스냅샷과 비교하나요?
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)CrudRepository의 Save 함수는 파라미터로 전달받은 객체의 PK컬럼의 값 존재 유무에 따라서 값이 없을 경우 persist 함수를 이용해, 값이 있을 경우 merge 함수를 통해 객체를 영속화 하는 메서드로 이해 하고 있습니다. 우선 저는 이러한 엔티티를 가지고 있습니다.package my.test.testproject.domain; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.hibernate.annotations.DynamicInsert; import org.hibernate.annotations.DynamicUpdate; import javax.persistence.*; @Entity @Getter @Setter @ToString @Table(name = "person") @DynamicInsert @DynamicUpdate public class Person { @Id Long id; String name; public Person() { } public Person(Long id, String name) { this.id = id; this.name = name; } }그리고 이러한 코드가 실행이 됩니다@Test @Transactional void PersonTest9() { Person person = new Person(300L, "Firmino"); personRepository.save(person); }참고로 Id가 300인 데이터는 이미 실제 데이터베이스에 존재하고 있습니다.이 경우에 save를 호출할 경우 PK값이 존재하기에 merge를 호출하고 객체가 영속화 되어서 트랜잭션이 커밋되면 변경감지를 통해 쓰기지연SQL저장소에 SQL이 생성이 될텐데 바로 이 SQL이 생성되는 과정에서 궁금한 점이 있습니다. 이 트랜잭션에서 Id가 300인 엔티티가 처음 영속화 되었습니다. 쓰기지연 SQL저장소에 SQL을 생성할때 스냅샷과 비교해서 SQL을 생성하는것으로 알고 있는데 그렇다면 이경우에는 제 예상에는 Insert 쿼리가 생성이 되어서 실행시 에러가 나야할것 같은데 실제로 실행을 해보면 select쿼리가 실행됩니다Hibernate: select person0_.id as id1_1_0_, person0_.name as name2_1_0_ from person person0_ where person0_.id=?결국 PK에 값이 있는 엔티티가 merge를 통해서 영속화 되었을때 이것을 쓰기지연 SQL저장소에 SQL을 만들때 스냅샷이 아닌 실제 데이터베이스와 비교해서 쿼리를 생성하는 것입니까? 제가 잘못 이해하고 있는 부분들이 있다면 알려주시기 바랍니다ㅠㅠ
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
프록시의 특징 질문
안녕하세요! 영한님질문 드립니다. 질문 1)만약 동일한 트랜잭션안에서 처음에 em.getReference()를 사용하면 프록시 객체를 반환하고, em.find()를 사용해도 프록시 객체를 반환한다.반대의 경우 동일한 트랜잭션안에서 처음에 em.find()를 사용하면 실제 엔티티가 반환되고, em.getReference()를 사용해도 실제 엔티티를 반환한다.제가 이해한게 맞을까요? 질문 2) em.getReference() 를 사용하여 프록시 객체를 조회한 프록시 객체도 결국 EntityManager를 사용하여 조회한 것이기 때문에 영속성 컨텍스트에서 관리되는 것 같은데 맞을까요? 감사합니다.^^
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
엔티티 매니저 동시성
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)일반적으로 스프링 컨테이너는 싱글톤 기반으로 동작하기에 빈은 모든 쓰레드가 공유합니다. 그런데@PersistenceContext을 통해 주입 받은 EntityManager는 동시성 문제가 발생하지 않는다고 해서 의문이 생겼습니다. 따라서 관련된 내용을 공부하던 중 아래 질문의 영한님 답변을 봤습니다. https://www.inflearn.com/questions/158967/%EC%95%88%EB%85%95%ED%95%98%EC%84%B8%EC%9A%94-entitymanager%EC%97%90-%EB%8C%80%ED%95%B4-%EA%B6%81%EA%B8%88%ED%95%9C-%EC%A0%90%EC%9D%B4-%EC%9E%88%EC%96%B4-%EC%A7%88%EB%AC%B8-%EB%82%A8%EA%B9%81%EB%8B%88%EB%8B%A4제가 이해한 바로는 private final EntityManager em;를 통해 주입 받은 엔티티매니저는 싱글톤 빈이지만 일반적인 빈들과는 다릅니다.공통점 : 일반적인 스프링 빈과 엔티티 매니저는 모두 프록시 객체를 주입받는다. 그리고 이는 모두 싱글톤이다.차이점 : 일반적인 스프링 빈은 호출될때마다 에플리케이션 전체를 대상으로 해당 빈이 스프링 컨테이너에 등록되어 있는지 찾고 있으면 스프링 컨테이너에서 찾아 반환, 없으면 빈을 생성하고 등록(CGLIB 기술)반면 엔티티매니저는 이해가 가지 않습니다. 책 581 페이지를 보면 A, B 코드에서 호출한 엔티티 매니저는 서로 다르며 , 582에서 멀티 쓰레드에서 같은 코드에서 호출한 엔티티 매니저는 서로 같습니다. 일반적인 싱글톤 빈들이나 엔티티 매니저 모두 싱글톤이며 프록시 객체를 주입 받는 것 같은데 그 안의 원리들이 조금 다른 것 같은데 이 점이 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
지연로딩과 페치조인을 이용한 메서드명에 대해 궁금한점이 있습니다.
모든 관계를 지연로딩으로 설계하고,성능을 최적화 시키기 위해 필요한 엔티티들만 페치조인을 이용하여 사용할 때영한님의 경우 메서드명을 어떻게 명명하시나요?실제로 실무에 적용 하다보니 이 부분이 정말 애매한 것같아서 질문드립니다.성능을 최적화 시킬려면 사용하는 주 엔티티(Member)에서 필요한 연관관계 엔티티(Team, Order, OrderItem, Item)들을 페치조인해서 사용해야 하는데 그러다보니 많은 메서드들이 나오고 그로인해 메서드명이 길어지는 등 문제가 발생하는데요..강의 내용을 예시로 들면// member - team 패치조인 getMemberWithTeam(Long memberId) // member - team, order 패치조인 getMemberWithTeamAndOrder(Long memberId) // member - team, locker, order 채치조인 getmemberWithTeamAndLockerAndOrder(Long memberId) ...이런 식으로 패치조인하는 엔티티명을 넣어주면 메서드명들이 너무 길어지고 난잡한? 느낌이 나서 영한님의 경우 어떻게 메서드명을 짓는지 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
uuid
안녕하세여 ! !ㅎㅎ uuid 말씀하셨는데 ,uuid 사용하는것과 그냥 private Long id 하는것에 차이점은 어떤것이 있을까여 ?? uuid 를 사요하게 되었을때 ,다른곳에서 fk 가져다가사용하게 될때 긴 string 이 fk 걸리니까 불편하지않나 ?? 생각이 드는데여 어떠한 방법을 사용하게 될까요 ??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
persist에 대하여...
안녕하세요. 공부하다 헷갈리는 부분이 있어서 질문드립니다.제가 알기로는 persist를 실행을 해도 트랜잭션이 끝날 때 쿼리가 나가면서 insert가 되는 걸로알고 있습니다. 그래서 아래 사진과 같은 테스트를 해봤습니다.@Slf4j @SpringBootTest @Transactional @Commit class CategoryRepositoryImplTest { @Autowired CategoryRepository categoryRepository; @Autowired EntityManager em; @Test void save() { Category category = new Category("상의", 1, null); category.addDate(LocalDateTime.now(), LocalDateTime.now()); em.persist(category); log.info("================================="); } } save를 실행해보았더니 로그가 아래와 같이 찍힙니다.2023-02-16 22:43:53.648 DEBUG 8220 --- [ main] org.hibernate.SQL : insert into t_category (mod_date, reg_date, depth, name, parent_id) values (?, ?, ?, ?, ?)2023-02-16 22:43:53.684 INFO 8220 --- [ main] s.s.r.c.CategoryRepositoryImplTest : ================================= persist를 날리면 메소드가 끝날 때 트랜잭션이 끝나기 때문에 insert쿼리가 로그보다 먼저 찍히면 안될 것 같은데 로그에는 그렇게 찍히니 조금 혼란스럽습니다.현재 저 프로젝트는 jpa, spring data jpa, querydsl 를 같이 사용하고 있습니다.왜 저렇게 동작되는지 원인을 알 수 있을까요?혹시나 해서 관련된 테이블 category클래스와 dateColumn 클래스도 캡처하겠습니다.@Entity @Table(name = "T_CATEGORY") @Getter @NoArgsConstructor(access = PROTECTED) public class Category extends DateColumns { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "CATEGORY_ID", nullable = false) private Long id; @Column(nullable = false) private String name; @Column(nullable = false) private Integer depth; @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "PARENT_ID") private Category parent; public Category(String name, Integer depth, Category parent) { this.name = name; this.depth = depth; if(depth > 1) { this.parent = parent; } } }@MappedSuperclass @Getter public class DateColumns { @Column(name = "REG_DATE", updatable = false, nullable = false) private LocalDateTime regDate; @Column(name = "MOD_DATE", nullable = false) private LocalDateTime modDate; public void addDate(LocalDateTime reg, LocalDateTime mod){ regDate = reg; modDate = mod; } }
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
강의 듣고 궁금한 점 질문 드립니다.
안녕하세요! 이번 강의를 들은 후 생긴 궁금증에 대해 질문 드립니다.1차 캐시 질문입니다.-> member1은 1차캐시와 db에 있고, member2는 1차 캐시에 없고 db에는 있는 상황을 봤을 때, 1차캐시가 저장(?)되려면 sava후 바로 find를 해야하나요? 즉, 하나의 트랜잭션 안에서 실행되어야 하는건가요? -> 1차 캐시가 성능면에서 엄청난 장점이 있지는 않다고 하셨는데, 그럼에도 아주 약간의 성능 개선(?)이 있기 때문에 영속성 컨텍스트의 장점이 되는건가요? 영속성 Entity의 동일성 보장 파트에서 질문입니다!-> 1차 캐시로 반복 가능한 읽기를 DB가 아닌 애플리케이션 차원에서 제공한다고 하셨는데, '애플리케이션 차원'이 정확한 어딘지? 무엇인지 궁금합니다! DB가 아닌 spring에서? 또는 jpa에서 트랜잭션 격리 수준을 제공해준다는 말씀이신가요? flush관련 질문입니다.-> 다음 강의에 설명이 자세히 있을 것 같긴 하지만... 강의를 듣기전 flush에 대한 제 생각과 들은 후의 이해도를 비교해 보고 싶어서 질문 남깁니다. transaction.commit()을 하면 쓰기 지연 저장소에 있는 쿼리들이 먼저 DB로 이동(flush)을 하고, 그 후에 실질적인 commit이 이루어진다고 이해하면 되나요? 개념적으로 flush와 commit의 차이를 잘 모르겠습니다!감사합니다!!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
EntityManager 질문드립니다
엔티티 매니저는 쓰레드간 공유를 하면 안된다고 하셨는데 Spring Data JPA를 사용할때는 save 같은 메서드별로 엔티티매니저가 생성되고 소멸되는것인지 아니면 요청 쓰레드 별로 하나의 엔티티매니저가 생성되는것인지 궁금합니다.