월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
allocationSize 질문
IDENTITY전략에서 allocationSize가 50개로 설정하면 50개를 가져와 메모리에서 쓴다고 하셨는데 제대로 이해를 하지 못한것 같습니다. DB에서 1부터 51까지 미리 늘려놓고? 51까지의 메모리..? 어떤 값을 가져와서 em.persist 할때마다 뭐 큐나 스택처럼 하나씩 빼면서 pk값을 넣는건지 궁금하네요. 또 메모리에서 쓴다는게 어떤건지 잘 모르겠습니다. DB에서 꺼내서 쓰는게 아닌것 까지는 이해했지만 메모리에서 쓴다..?를 잘 모르겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
트랜잭션 커밋 질문
섹션3 플러시 부분을 듣다가 궁금증이 생겨 질문을 남깁니다.3분에 말씀하신 내용에 따르면 try{ Member member = new Member(200L,"member200"); em.persist(member); em.flush(); //영속 System.out.println("===================="); tx.commit(); } catch (Exception e){ tx.rollback(); }finally { em.close(); } emf.close();em.flush()를 하면 데이터베이스에 쿼리가 나가고 tx.commit()을 통해 트랜잭션 커밋이 된다고 하셨는데 트랜잭션 커밋을 언제 사용하는지?가 궁금합니다. 그냥 플러시를 하기 위해서 쓰이는 것인지 아니면 try catch문으로 되어있어서 try문에서 제대로 동작을 한다면 마지막에 DB에 잘 적용되었다는 느낌으로 commit을 하는것이 맞나요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
배치사이즈 100 설정시 in절 100개에 대한 내용입니다.
https://ttl-blog.tistory.com/1202데이터는 3개있는데쿼리에서 in절에 100개가 찍혀서 검색하다보니 이런글이 있네요결론:dependency 의 하이버네이트 버전을 변경해야한다.hibernate-core:6.2.0.CR2 디펜던시 버전은 해당 오류에 대한 적용이 안되어있어서 다운그레이드 해야하네요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다를 다대일 일대다로 사용하면 안되는 걸까요?
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용] 안녕하세요! 다대다 매핑 관련하여 질문드립니다. 강의에서도 그렇고구글링을 했을 때도 그렇고 다대다 매핑을 항상@oneToMany @ManyToOne 으로 매핑을 하더라구요! 그러다가 문득@ManyToOne @OneToMany로 다대다를 풀어내는 경우는아예 없는건지 궁금해졌습니다.제가 지금 사이드 프로젝트를 하고 있는데erd를 @ManyToOne @OneToMany로 해놨었거든요..! 이 경우에 어떤 문제가 발생하는지 실무에서는 아예 사용하지 않는 다대다 매핑 방법인지 사용한다면 어떤 경우에 사용되는 것인지가궁금합니다..!
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
em.createQuery() 파라미터 질문드려요.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요. 저의 경우에 인텔리j에서 저런식으로 String으로만파라미터가 잡히는데,강의 내용처럼 qlString으로 바꾸려면 어떻게 해야하나요.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
dialect 질문 있습니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]우선 개발 버전은 JDK 17입니다.강의에서 강사님이 h2를 이용하며 OracleDialect로 변경 후 정상적으로 동작이 되었는데현재 저의 셋팅에서는 정상적으로 작동이 되지 않더라구요H2 홈페이지를 검색 해본결과 Mode를 Oracle을 추가하면된다고 나와있었고 MODE를 Oracle로 변경하여도 오류가 발생하였습니다..오류내용은 https://www.inflearn.com/questions/1171985/dialect-%EC%84%A4%EC%A0%95-%EC%98%A4%EB%A5%98-%EC%A7%88%EB%AC%B8%EB%93%9C%EB%A6%BD%EB%8B%88%EB%8B%A4이분과 같습니다..David님이 달아주신 답변에는 ojdbc를 의존성 추가를 하는것으로 되어있는데 시도해보았지만 해결되지 않았습니다..물론 이게 강의에 중점은 아니지만 스스로 해결해보려 해도 답이 안나와서 질문드립니다...다른 추가적인 설정이 필요한걸까요??ㅜㅜException in thread "main" jakarta.persistence.PersistenceException: [PersistenceUnit: hello] Unable to build Hibernate SessionFactory at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1591) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1512) at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:55) at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80) at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) at jpql.JpaMain.main(JpaMain.java:14) Caused by: org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpql.Product] at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:230) at org.hibernate.id.factory.internal.IdentifierGeneratorUtil.createLegacyIdentifierGenerator(IdentifierGeneratorUtil.java:127) at org.hibernate.mapping.SimpleValue.createGenerator(SimpleValue.java:415) at org.hibernate.internal.SessionFactoryImpl.lambda$createGenerators$1(SessionFactoryImpl.java:457) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183) at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179) at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150) at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596) at org.hibernate.internal.SessionFactoryImpl.createGenerators(SessionFactoryImpl.java:456) at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:271) at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450) at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507) ... 4 more Caused by: org.hibernate.HibernateException: Could not fetch the SequenceInformation from the database at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.sequenceInformationList(ExtractedDatabaseMetaDataImpl.java:307) at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.getSequenceInformationList(ExtractedDatabaseMetaDataImpl.java:151) at org.hibernate.id.enhanced.SequenceStyleGenerator.getSequenceIncrementValue(SequenceStyleGenerator.java:581) at org.hibernate.id.enhanced.SequenceStyleGenerator.adjustIncrementSize(SequenceStyleGenerator.java:259) at org.hibernate.id.enhanced.SequenceStyleGenerator.configure(SequenceStyleGenerator.java:207) at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:224) ... 20 more Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ALL_SEQUENCES" not found; SQL statement: select * from all_sequences [42102-224] at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) at org.h2.message.DbException.getJdbcSQLException(DbException.java:489) at org.h2.message.DbException.get(DbException.java:223) at org.h2.message.DbException.get(DbException.java:199) at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8064) at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8035) at org.h2.command.Parser.readTableOrView(Parser.java:8024) at org.h2.command.Parser.readTablePrimary(Parser.java:1788) at org.h2.command.Parser.readTableReference(Parser.java:2268) at org.h2.command.Parser.parseSelectFromPart(Parser.java:2718) at org.h2.command.Parser.parseSelect(Parser.java:2824) at org.h2.command.Parser.parseQueryPrimary(Parser.java:2708) at org.h2.command.Parser.parseQueryTerm(Parser.java:2564) at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2543) at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2536) at org.h2.command.Parser.parseQueryExpression(Parser.java:2529) at org.h2.command.Parser.parseQuery(Parser.java:2498) at org.h2.command.Parser.parsePrepared(Parser.java:627) at org.h2.command.Parser.parse(Parser.java:592) at org.h2.command.Parser.parse(Parser.java:564) at org.h2.command.Parser.prepareCommand(Parser.java:483) at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639) at org.h2.server.TcpServerThread.process(TcpServerThread.java:289) at org.h2.server.TcpServerThread.run(TcpServerThread.java:191) at java.base/java.lang.Thread.run(Thread.java:833) at org.h2.message.DbException.getJdbcSQLException(DbException.java:514) at org.h2.engine.SessionRemote.readException(SessionRemote.java:650) at org.h2.engine.SessionRemote.done(SessionRemote.java:619) at org.h2.command.CommandRemote.prepare(CommandRemote.java:78) at org.h2.command.CommandRemote.<init>(CommandRemote.java:50) at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:487) at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166) at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:93) at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:316) at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43) at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39) at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.sequenceInformationList(ExtractedDatabaseMetaDataImpl.java:291) ... 25 more
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블간에 연관관계가 없을 때 질문입니다.
안녕하세요만약 여러 테이블이 있는데 서로 연관관계가 맺어있지 않다면,JPA를 통해 JOIN이 불가능할까요? @ManyToOne과 같은 어노테이션을 사용할수 없는걸까요?모든 테이블이 PK만 있고 FK가 없는 상태입니다.USER 테이블에ID(PK)PC_IDNAME PC 테이블에ID(PK)PC_NAME 위와같이 컬럼이 있을 때, USER 테이블에 PC_ID를 FK로 지정하지 않아도, JPA에서 활용할 수 있을까요?현재 구현한 모든테이블이 이와같이 FK는 없고, PK만 지정되어있습니다 ㅠ 기존에 JDBC를 사용할땐 그냥 A.PC_ID와 B.ID를 JOIN해서 사용했습니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
Entity 설계 시 고민되는 부분 문의드립니다.(@Setter, @Builder 미사용 시 테스트 등)
토이프로젝트나 회사에서 엔티티 설계 하면서 고민되는 부분이 있어서 문의드립니다. 엔티티에 @Setter 나 @Setter 가 포함된 @Data 애노테이션을 추가하지 않는 것이 좋다고 강의에서 들어서 설계 시 해당 부분을 제외하고 있습니다.@Entity @Getter @SuperBuilder @NoArgsConstructor(access = AccessLevel.PROTECTED) @Table(name = "book") public class Book extends BaseDateEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "book_id", updatable = false) private Long id; @Column(name = "title", length = 200, nullable = false) private String title; @Column(name = "author") private String author; @Column(name = "price") private int price; @Column(name = "publisher") private String publisher; @Column(name = "publish_at") private LocalDate publishAt; @Column(name = "isbn", nullable = false) private String isbn; @Column(name = "sort", nullable = false) private String sort; @Column(name = "image", columnDefinition = "TEXT") private String image; @Column(name = "link", columnDefinition = "TEXT") private String link; } @Builder는 엔티티 클래스에 붙이고 있는데, 이렇게 되면 사실 점층적 생성자가 있는것과 다를바 없이 객체를 생성할 수 있기 때문에 좋은 방법이 아닌거 같아 문의드립니다.실무에서는 보통 어떤 식으로 사용하시는지 궁금하여 문의드립니다. 별도의 of, create 메서드를 static으로 만들어서 생성하기도 하는데요. 이렇게 되면 테스트 코드 작업 시 @BeforeEach로 초기 데이터를 추가하기 쉽지 않더라고요. 어느정도 수준으로 실무에서 사용하는 것이 적절할지 궁금합니다. public static Reservation create(String userName, String phoneNumber, Performance performance, PerformanceSeat performanceSeat) { return Reservation.builder() .userName(userName) .phoneNumber(phoneNumber) .title(performance.getTitle()) .round(performance.getRound()) .amount(performance.getPrice()) .status(ReservationStatus.APPLY) .performance(performance) .performanceSeat(performanceSeat) .build(); } [문의 내용 정리]Q1) JPA Entity 클래스에 @Builder 애노테이션을 추가하는 것은 좋지 않은 방식일까요? 그렇다면 어떻게 사용하는것이 적절할까요?Q2) @Builder 패턴, 기본 생성자, setter 제외한 경우 테스트 코드에서 @BeforeEach로 초기 데이터를 추가 시 어떻게 하는 것이 좋을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
22: 10 초 질문입니다.
=======================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]22: 10 초에서는 Team과 Member의 join fetch 를 진행하면 result = 3 의 결과가 나오는데 저는 계속해서 result = 2의 결과가 나와서 질문드립니다. 최신 버전으로 인해서 jpa 최적화 방식의 변화가 생겨서 그런 것인지 아니면 제가 실수한 것인지 궁금합니다.JpaMain 실행결과: 디비 상태: package jpql; import jakarta.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 teamA = new Team(); teamA.setName("teamA"); em.persist(teamA); Team teamB = new Team(); teamB.setName("teamB"); em.persist(teamB); Member member1 = new Member(); member1.setUsername("회원1"); member1.setAge(10); member1.setTeam(teamA); em.persist(member1); Member member2 = new Member(); member2.setUsername("회원2"); member2.setAge(10); member2.setTeam(teamA); em.persist(member2); Member member3 = new Member(); member3.setUsername("회원3"); member3.setAge(10); member3.setTeam(teamB); em.persist(member3); em.flush(); em.clear(); String query = "select t from Team t join fetch t.members"; List<Team> result = em.createQuery(query, Team.class) .getResultList(); System.out.println("result = " + result.size()); for (Team team : result) { System.out.println("team = " + team.getName()); for(Member member : team.getMembers()){ System.out.println("-> member = " + member.getUsername()); } } tx.commit(); } catch(Exception e){ e.printStackTrace(); tx.rollback(); } } } package jpql; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; import jakarta.persistence.OneToMany; import java.util.ArrayList; import java.util.List; @Entity public class Team { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "team") private List<Member> members = new ArrayList<>(); public List<Member> getMembers() { return members; } public void setMembers(List<Member> members) { this.members = members; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } package jpql; import jakarta.persistence.*; @Entity public class Member { @Id @GeneratedValue private Long id; private String username; private int age; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; @Enumerated(EnumType.STRING) private MemberType type; public MemberType getType() { return type; } public void setType(MemberType type) { this.type = type; } public void changeTeam(Team team) { this.team = team; team.getMembers().add(this); } public Team getTeam() { return team; } public void setTeam(Team team) { this.team = team; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Member{" + "id=" + id + ", username='" + username + '\'' + ", age=" + age + '}'; } }
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
2depth의 @OneToOne, @ManyToOne N+1문제
Shop, Business, User라는 세 엔티티에 연관관계가 각각 맺어져 있습니다.Shop - Business(연관관계 주인은 Business, OneToOne관계)Business - User(연관관계 주인은 Business, ManyToOne-OneToMany 관계)여기서, 모든 관계는 Lazy로딩으로 설정되어 있고, shop의 business는 null로 존재하는 상황입니다.문제의 상황은 크게 두가지인데요.Shop을 조회할 때 Business Lazy로딩으로 설정되었지만, Business에 대한 조회 쿼리가 발생위 상황에서 Business가 조회되고, 거기에 ManyToOne으로 연관된 User도 조회 쿼리 추가로 발생그래서 1개의 조회를 했는데, 2개가 추가로 나옵니다. 사실 첫 번째 문제는 찾아보니 null값을 Proxy객체가 담을 수 없어서 조회쿼리가 발생하는 것이라고 들었습니다. 그런데 두 번째 쿼리(User의 조회 쿼리)는 왜 발생하는지 도저히 모르겠네요..ㅠ 아래는 Shop, Business, User의 코드입니다. 코틀린으로 작성된 점 양해부탁드립니다.@Entity class Shop( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "shop_id") var id: Long = 0L, ... @OneToOne(mappedBy = "shop", cascade = [CascadeType.ALL], orphanRemoval = true) var business: Business? = null, )@Entity class Business ( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "business_id") var id: Long = 0L, ... @OneToOne(fetch = FetchType.LAZY) @JoinColumn(name = "shop_id") var shop: Shop, @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id") val seller: User )@Entity class User( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "user_id") var id: Long = 0L, ... @OneToMany(mappedBy = "seller", cascade = [CascadeType.PERSIST], orphanRemoval = true) val businessList: MutableList<Business> = mutableListOf(), )
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
dialect 설정 오류 질문드립니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? 네2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? 네3. 질문 잘하기 메뉴얼을 읽어보셨나요? 네[질문 내용]오라클로 방언 설정시 이러한 오류가 나타나는데 찾아봐도 해결을 하지 못해서 문의 드립니다.HHH000511: The 2.2.0 version for [org.hibernate.dialect.OracleDialect] is no longer supported, hence certain features may not work properly. The minimum supported version is 19.0.0. Check the community dialects project for available legacy versions.HHH90000025: OracleDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]Exception in thread "main" jakarta.persistence.PersistenceException: [PersistenceUnit: hello] Unable to build Hibernate SessionFactoryat org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.persistenceException(EntityManagerFactoryBuilderImpl.java:1591)at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1512)at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:55)at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:80)at jakarta.persistence.Persistence.createEntityManagerFactory(Persistence.java:55)at jpql.JpaMain.main(JpaMain.java:14)Caused by: org.hibernate.MappingException: Could not instantiate id generator [entity-name=jpql.Product]at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:230)at org.hibernate.id.factory.internal.IdentifierGeneratorUtil.createLegacyIdentifierGenerator(IdentifierGeneratorUtil.java:127)at org.hibernate.mapping.SimpleValue.createGenerator(SimpleValue.java:415)at org.hibernate.internal.SessionFactoryImpl.lambda$createGenerators$1(SessionFactoryImpl.java:457)at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)at java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:179)at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779)at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)at org.hibernate.internal.SessionFactoryImpl.createGenerators(SessionFactoryImpl.java:456)at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:271)at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:450)at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1507)... 4 moreCaused by: org.hibernate.HibernateException: Could not fetch the SequenceInformation from the databaseat org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.sequenceInformationList(ExtractedDatabaseMetaDataImpl.java:307)at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.getSequenceInformationList(ExtractedDatabaseMetaDataImpl.java:151)at org.hibernate.id.enhanced.SequenceStyleGenerator.getSequenceIncrementValue(SequenceStyleGenerator.java:581)at org.hibernate.id.enhanced.SequenceStyleGenerator.adjustIncrementSize(SequenceStyleGenerator.java:259)at org.hibernate.id.enhanced.SequenceStyleGenerator.configure(SequenceStyleGenerator.java:207)at org.hibernate.id.factory.internal.StandardIdentifierGeneratorFactory.createIdentifierGenerator(StandardIdentifierGeneratorFactory.java:224)... 20 moreCaused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "ALL_SEQUENCES" not found; SQL statement:select * from all_sequences [42102-224]at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)at org.h2.message.DbException.getJdbcSQLException(DbException.java:489)at org.h2.message.DbException.get(DbException.java:223)at org.h2.message.DbException.get(DbException.java:199)at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8064)at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8035)at org.h2.command.Parser.readTableOrView(Parser.java:8024)at org.h2.command.Parser.readTablePrimary(Parser.java:1788)at org.h2.command.Parser.readTableReference(Parser.java:2268)at org.h2.command.Parser.parseSelectFromPart(Parser.java:2718)at org.h2.command.Parser.parseSelect(Parser.java:2824)at org.h2.command.Parser.parseQueryPrimary(Parser.java:2708)at org.h2.command.Parser.parseQueryTerm(Parser.java:2564)at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2543)at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2536)at org.h2.command.Parser.parseQueryExpression(Parser.java:2529)at org.h2.command.Parser.parseQuery(Parser.java:2498)at org.h2.command.Parser.parsePrepared(Parser.java:627)at org.h2.command.Parser.parse(Parser.java:592)at org.h2.command.Parser.parse(Parser.java:564)at org.h2.command.Parser.prepareCommand(Parser.java:483)at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:639)at org.h2.server.TcpServerThread.process(TcpServerThread.java:289)at org.h2.server.TcpServerThread.run(TcpServerThread.java:191)at java.base/java.lang.Thread.run(Thread.java:842)at org.h2.message.DbException.getJdbcSQLException(DbException.java:514)at org.h2.engine.SessionRemote.readException(SessionRemote.java:650)at org.h2.engine.SessionRemote.done(SessionRemote.java:619)at org.h2.command.CommandRemote.prepare(CommandRemote.java:78)at org.h2.command.CommandRemote.<init>(CommandRemote.java:50)at org.h2.engine.SessionRemote.prepareCommand(SessionRemote.java:487)at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1166)at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:93)at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:316)at org.hibernate.tool.schema.extract.spi.ExtractionContext.getQueryResults(ExtractionContext.java:43)at org.hibernate.tool.schema.extract.internal.SequenceInformationExtractorLegacyImpl.extractMetadata(SequenceInformationExtractorLegacyImpl.java:39)at org.hibernate.engine.jdbc.env.internal.ExtractedDatabaseMetaDataImpl.sequenceInformationList(ExtractedDatabaseMetaDataImpl.java:291)... 25 more [해결]mysql 방언은 url 뒤에 ;MODE=MySql 을 추가하니 해결되었습니다. mysql 방언으로 바꾸어 보아도 위와 비슷한 오류로 시작합니다.HHH000511: The 2.2.0 version for [org.hibernate.dialect.MySQLDialect] is no longer supported, hence certain features may not work properly. The minimum supported version is 8.0.0. Check the community dialects project for available legacy versions.HHH90000025: MySQLDialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
특정 칼럼에 대한 조회시 TypedQuery 사용에 대하여
안녕하세요, 예전에 수업들은 이후 한창 현업 중에 잘못 사용한 Case 이지만, 왜 그럴까 디버깅도 좀 해보고 생각을 많이 해보다가 해결을 못하고 질문을 남기게 되었습니다. 그나마 관련이 있는 부분을 찾아서 남기게 되었습니다. 앱에는 Foo 라는 엔티티가 있고, 우선 다음과 같은 JPQL 쿼리를 발생시켰습니다. String jpql = "SELECT f.id FROM Foo f " + "WHERE f.name = :name " + "ORDER BY f.createdAt DESC" // id 라는 특정 칼럼 조회이므로 Type 을 명시하지 않고 Query 를 써야 하는게 맞지만, 잘못 사용해서 TypedQuery 를 사용함 List<Foo> fooList = em.createQuery(jpql, Foo.class).setParameter("name", name).getResultList(); 일단 예외가 나지 않고 fooList 라는 List 가 반환된다는 것도 신기했습니다. 정확한 이해를 하지는 못했지만 디버깅 해본 결과, CgLibAopProxy 클래스들을 타는걸보면, Lazy 로딩과 유사하게 CustomFoo extends Foo 와 같은 상속객체를 만들어서, id 만 채워준 후 List 에 넣어서 반환해주기 때문에 문법적으로 fooList 를 만들 때 오류가 발생하는게 아니구나 판단했습니다. (아닐 수도 있습니다.. 제 생각) 이후 fooList.get(index) 를 시도하면서 바로 Casting 예외가 발생하였습니다. (Long 객체를 Foo 객체로 Casting 할 수 없다) 신기해서 IntelliJ 에서 디버깅 하면서 확인했을 때, fooList 라는 List 안에 Foo 객체들이 들어 있지 않고, Long 객체들이 들어 있는 모습을 확인했습니다. 이거는 좀 매우 이상한게, 어쨌든 Foo 라는 Type 이 들어가게끔 선언된 List 에 어떻게 Long 객체들만 들어가 있을 수 있는지가 이해가 되지 않았습니다. createQuery() 함수와 getResultList() 함수간 복잡한 제네릭 관계들을 이해하기가 어려워서 이 부분을 이해하지 못한 것 같기도 합니다. 물론 TypedQuery 를 사용하지 않고 Query 를 사용하거나 DTO 를 통해 매핑해주는 것이 맞지만, 지금 상황 기준으로 어떠한 이유로 List 형성 중 에러가 나지 않은 것인지 또 어떻게 List<Foo> 안에 인텔리제이 디버깅 기준으로 Long 객체들이 들어가 있을 수 있는 것인지 궁금합니다_-----------------------------추가로 나중에 subQuery 안에서도 동일하게 사용이 되었는데, 이런 경우는 쿼리 결과를 반환해주지 않고 그냥 쿼리문을 만들 때만 사용되어서 그런지 아무 에러가 발생하지 않았습니다. SELECT SUM(~~.~~) from Bar bar WHERE bar.foo.id in ( SELECT f.id FROM Foo f ~~ )
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
Main에서오류
다른거 다 똑같이 했는데 프로젝트 만들자마자 메인에서 오류가나서 실행도 안되요. 왜이러나요 ㅠㅠ ;는 어디가 누락된건가요 ? 해결책 알려주시면 감사하겠습니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
localhost로 접속 확인했는데도 쿼리가 안나갑니다.
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.persistence.xml 도 jpashop 으로 수정했는데도 메인이 안돌아갑니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
2024 최신버전으로 프로젝트 설정하기 오류
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]강의자의 로드맵대로 따라 강의를 순차적으로 진행하고있습니다. 로드맵에서 추천해주신대로 실전!스프링 부트와 JPA 활용1 을 선 수강하고 이번 기본편을 수강하려고 하는데 이전 강의인 활용1편에서 H2 DB와 intellij를 최신버전으로 설치해두어 그대로 사용하려고 하는데 오류가 발생해서 문의 드립니다.프로젝트의 내용은 학습자료인 2024 최신버전으로 프로젝트 생성하기의 소스코드를 open project 하여 진행하였으며 h2 데이터베이스의 설정도 프로젝트 생성 설명에 나와있는대로 진행하였습니다. 2월 05, 2024 6:14:22 오후 org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformationINFO: HHH000204: Processing PersistenceUnitInfo [name: hello]2월 05, 2024 6:14:22 오후 org.hibernate.Version logVersionINFO: HHH000412: Hibernate ORM core version 6.4.2.Final2월 05, 2024 6:14:22 오후 org.hibernate.cache.internal.RegionFactoryInitiator initiateServiceINFO: HHH000026: Second-level cache disabled2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configureWARN: HHH10001002: Using built-in connection pool (not intended for production use)2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001005: Loaded JDBC driver class: org.h2.Driver2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001012: Connecting with JDBC URL [jdbc:h2:tcp://localhost/~/test]2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001001: Connection properties: {password=****, user=sa}2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreatorINFO: HHH10001003: Autocommit mode: false2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PooledConnections <init>INFO: HHH10001115: Connection pool size: 20 (min=1)2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl constructDialectWARN: HHH90000025: H2Dialect does not need to be specified explicitly using 'hibernate.dialect' (remove the property setting and it will be selected by default)2월 05, 2024 6:14:23 오후 org.hibernate.engine.transaction.jta.platform.internal.JtaPlatformInitiator initiateServiceINFO: HHH000489: No JTA platform available (set 'hibernate.transaction.jta.platform' to enable JTA platform integration)2월 05, 2024 6:14:23 오후 org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl$PoolState stopINFO: HHH10001008: Cleaning up connection pool [jdbc:h2:tcp://localhost/~/test]오류 메세지입니다.
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
super class 를 필드로 가지는 엔티티에서 super 가 아닌, sub 로 가지고 올 때의 전략
강의의 예제와 비슷하게, Item 과 Order 라는 엔티티가 있고 OrderItem 이라는 엔티티가 그 사이에서 "주문한 상품" 목록을 정의하고 있습니다. 이때 Order 는 일대다로 Set<OrderItem> 을 참조합니다.그런데 회사에서 요구사항으로 Order 와 함께 각각 Item 의 서브타입인 Album, Movie, Book 정보를 모두 각각 조회해달라고 하는 상황입니다. OrderItem 은 Item 만을 가지고 있기 때문에 구체 클래스인 Album 등을 orderItem.getAlbum(); 처럼 가져오지 못 하는 상황인데, 이때 이를 가져올 수 있는 전략에는 어떤 것들이 있을까요? itemId 로 다시 repository 로 데이터를 가져온다. Item getItem = orderItem.getItem(); if (getItem.getType() == ALBUM) { Optional<Album> optAlbum = albumRepository.findById(getItem.getId()); } else if ... OrderItem 이 super 클래스가 아니라 sub 클래스를 참조하도록 한다.public class OrderItem { // ... @OneToMany(...) @JoinColumn(...) private Album album; @OneToMany(...) @JoinColumn(...) private Movie movie; // ... } 일단 생각나는 방법은 위 2개인데, 각각 단점이 있다고 생각해서 개인적으로는 만족하지 못 한 상황입니다.일단 위 방법 중 1번 방법으로 데이터를 반환해주고 있는 상황입니다. 2번은 테스트도 안 해보긴 했지만, 저렇게 하면 안 될 것 같아서요. 맘 같아선 API 분리해서 던져주고 싶은데 그러지도 못 하는 상황이고 ... 그냥 마법 같이 내가 가져온 Item 이 Album 타입이면 알아서 Album 으로 조회한다든지, 그런 기능이 있었으면 참 좋겠다 싶은 생각이 드네요 아무튼, 이렇게 super class 를 필드로 가지는 엔티티가 그 super class 를, 타입에 따라 알맞는 상속 받는 sub 클래스를 가져오려면 어떤 전략이나 기능을 사용해야 하고, 어떤 것들이 고려되어야 할까요? 늘 좋은 강의 감사합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
연관관계 지연로딩 관련 문의
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]첫번째 캡쳐본의 경우에는 em.getReference(Member.class, member.getId()); 할 때 select 문이 실행되지 않았는데, 여기 두번째 캡쳐본의 경우에는 em.getReference(Member.class, member1.getId()); 할 때 select 문이 실행되는 이유가 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대일 양방향 연관관계를 사용할 경우 질문이 있습니다.
## 다대일 양방향 연관관계를 사용할 경우 질문이 있습니다 아래와 같이 Reply 엔티티를 생성할 때 Board엔티티의 List<Reply> replies에 추가를 해주어야 하기 떄문에, 엔티티 생성시 필요한 엔티티에 대한 select문은 getReferenceById를 사용해서 없앨 수 있었고 Reply엔티티 생성도 할 수 있었다. ````agsl @Transactional public Reply addReply(Long memberId, Long boardId, String content) { Member member = memberRepository.getReferenceById(memberId); //엔티티 생성에 불필요한 select문 없다. Board board = boardRepository.getReferenceById(boardId); System.out.println("==================="); Reply reply = Reply.createReply(member, board, content); System.out.println("==================="); return replyRepository.save(reply); } ```` 다만 다대일 양방향 연관관계의 경우 댓글을 저장할 때마다, Board에 대한 Select쿼리가 발생한다. ````agsl public static Reply createReply(Member member, Board board, String content) { Reply reply = new Reply(); reply.member = member; reply.board = board; reply.content = content; reply.likeCount = 0; reply.isDeleted = false; log.info("board select 발생 넣기 --"); board.addReply(reply); log.info("board select 발생 넣기 --"); return reply; } ```` 이렇게 댓글을 저장할 때 마다 board에 대한 select쿼리가 발생하다 보니 다대일 양방향 관계를 하지 말아야 하는 생각이 드는데요.. 지금 프로젝트에서는 양방향 연관관계의 장점은 영속성 전이와 orphanremoval을 사용헤서 게시글 삭제시 댓글이 모두 삭제되는 이점을 얻는다는 것이 있습니다. 물론 board삭제할 경우 replyrepository에서 boardId를 통한 댓글 삭제가 가능할 것으로 생각 되는데요. 댓글을 작성할 때마다 Board select쿼리가 나가는 것은 성능상의 이슈로 봐야 할까요?? -> 다대일 단방향 연관관계로 바꾸는게 맞을까요? 아니면 양방향 연관관계의 경우 JPA를 사용하지 않을시 객체지향적 코드를 보장한다는 이야기를 들었는데 Board조회시 조인하여 Reply 컬렉션을 조회할 수 있다는 것이 장점으로 느껴지긴 합니다 (단방향 연관관계일 경우 reply 컬렉션 조회 메서드를 따로 작성해서 해결해야 함.) 어떤 선택을 해야할 지 질문드립니다!! 어떤 선택을 해야 할까요? 아래는 발생 쿼리 로그입니다. ```agsl =================== 2024-02-03T14:15:00.936+09:00 INFO 2612 --- [ Test worker] cos.blog.web.model.entity.Reply : board select 발생 넣기 -- 2024-02-03T14:15:00.937+09:00 DEBUG 2612 --- [ Test worker] org.hibernate.SQL : select b1_0.board_id, b1_0.content, b1_0.created_time, b1_0.last_modified_time, b1_0.member_id, b1_0.title from board b1_0 where b1_0.board_id=? 2024-02-03T14:15:00.938+09:00 INFO 2612 --- [ Test worker] p6spy : #1706937300938 | took 0ms | statement | connection 74| url jdbc:h2:tcp://localhost/~/blog select b1_0.board_id,b1_0.content,b1_0.created_time,b1_0.last_modified_time,b1_0.member_id,b1_0.title from board b1_0 where b1_0.board_id=? select b1_0.board_id,b1_0.content,b1_0.created_time,b1_0.last_modified_time,b1_0.member_id,b1_0.title from board b1_0 where b1_0.board_id=31; 2024-02-03T14:15:00.939+09:00 INFO 2612 --- [ Test worker] cos.blog.web.model.entity.Reply : board select 발생 넣기 -- =================== 2024-02-03T14:15:00.940+09:00 DEBUG 2612 --- [ Test worker] org.hibernate.SQL : insert into reply (board_id, content, created_time, is_deleted, last_modified_time, like_count, member_id, reply_id) values (?, ?, ?, ?, ?, ?, ?, default) 2024-02-03T14:15:00.942+09:00 INFO 2612 --- [ Test worker] p6spy : #1706937300942 | took 0ms | statement | connection 74| url jdbc:h2:tcp://localhost/~/blog insert into reply (board_id,content,created_time,is_deleted,last_modified_time,like_count,member_id,reply_id) values (?,?,?,?,?,?,?,default) insert into reply (board_id,content,created_time,is_deleted,last_modified_time,like_count,member_id,reply_id) values (31,'replyreply','2024-02-03T14:15:00.939+0900',false,'2024-02-03T14:15:00.939+0900',0,12,default); =================== ```
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
상속관계 설정시, Getter & Setter 설정
해당 강의에서는 Lombok을 사용하지 않지만, 실습중에 lombok을 추가하여 @Getter, @Setter를 사용하여 자동으로 메서드를 생성해 주었습니다. 그런데 상속 받은 자식 클래스에서 부모 클래스의 필드에 접근은 가능하지만, 서버를 돌리면 부모 클래스 필드를 인식하지 못한다는 오류가 나옵니다. Item.java@Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn @Getter @Setter public abstract class Item { @Id @GeneratedValue @Column(name = "ITEM_ID") private Long id; private String name; private int price; private int stockQuantity; @ManyToMany(mappedBy = "items") private List<Category> categories = new ArrayList<>(); } Book.javapackage jpabook.jpashop.domain; import lombok.Getter; import lombok.Setter; import javax.persistence.Entity; @Entity @Getter @Setter public class Book extends Item{ private String author; private String isbn; } JpaMain.javaBook book = new Book(); book.setPrice(15000); book.setName("JPA"); book.setAuthor("USERA"); main 함수를 build하면 아래와 같은 오류가 뜹니다. 해당 오류에 대한 원인과 해결 방안이 궁금합니다.src\main\java\jpabook\jpashop\JpaMain.java:25: error: cannot find symbol book.setPrice(15000); ^ symbol: method setPrice(int) location: variable book of type Book
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
일대다 다대일 최적화 질문하기
안녕하세요 모든 강의를 수강중인 학생입니다.다대다 관계를 사용하지 않아서 일대다 다대일로 풀어내는데이때 조회에서 최적화를 하려면 A(1) <-> B(다) <-> C(1) 조건 상황은 A가 C에 있는 name 값을 알고 싶어합니다.인경우에 A에 default_batch_fetch_size를 적용하여 B의 컬렉션을 가져왔습니다.그 후 B에서 다시 C에 있는 name라는 필드값을 사용해야하는데 그렇다면 다시 fetch join을 하나요...?그렇게되면 다시 조회하는 느낌이 나서 고민이 되네요.... A->B까지만 default_batch_fetch_size 한뒤 혹은 지연로딩으로 가져오나요...?(이건 쿼리가 다:1 수 만큼 나가네요) 또한 기준 테이블을 B로 바꾸자니 A를 조회하는 것이 메인이여서 가독성 측면에서 떨어지고 구조가 망가지는 느낌이 들어 현업에서는 어떤지 질문남깁니다! 감사합니다 🙂