월 24,200원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
질문입니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]Member findMember = em.find(Member.class, member.getId()); em.detach(findMember); System.out.println("findMember.getUsername() = " + findMember.getUsername());프록시를 detach() 했을땐 이름 조회 안되고, find()로 했을 땐 detach() 해도 이름 조회되는게 프록시는 껍질 엔티티를 받는거라서 detach() 하면 안되고, find 로 받으면 실제 엔티티라서 detach() 해도 이름 조회가 되는건가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본 키 매핑 member.getId() 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]섹션 4 기본키 매핑 중 24:56분identity전략을 사용하고 em.persist을 하고난 뒤, member.getId()했을때 select 쿼리가 왜 안날라가는지에 대해 설명하실 때 JDBC 드라이버 관련된 이야기를 하셨습니다.근데 em.persist를 하고 난 뒤면, 해당 멤버에 대한 엔티티가 1차 캐시에 이미 저장되어 있기 때문에 JDBC 내부 동작과는 관련없이 select 쿼리가 안나가는 것 아닌가요? DB까지 갈 필요없이 1차 캐시에 존재하니까..?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
update 모드에서 @Column(unique = true) 추가 시 변경 적용 안
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]update 모드에서 기존엔티티에 @Column(unique = true) 를 사용한다음 재시작을 했는데, 변경 사항이 h2에 적용이 되지 않습니다.그런데 @Column(name="username", unique=true) 를 하니 이번에는 ALTER 쿼리가 나가서 name과 unique 변경사항이 db에 적용이 됩니다.update 모드에서 @Column(unique = true) 를 했을때 적용이 되지 않고 @Column(name="username", unique=true) 이렇게 해야만 적용이 되는 이유를 알 수 있을까요?
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
객체를 테이블에 맞추어 모델링 할때
[질문 내용]안녕하세요강의 진도를 약 40% 가량 나가다가 다시 처음부터 듣는 와중에 이번 강의에서 궁금증이 생겨 질문드립니다.객체와 관계형 DB의 차이중 2번의 연관관계에서"객체를 테이블에 맞추어 모델링"했다고 하셨는데 이게 객체다운 모델링이 아닐 수 있다는건 이해가 갑니다. 그런데 일부러 객체를 테이블에 맞추어 모델링하는 경우가 있나요? 아래와 같이 Member형 필드를 쓰는게 아니라 일부러 id를 쓰는 경우가 있을지 궁금합니다 @Entity class Team { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @ManyToOne Member member; }
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1:N 을 N:1로 바꿔 페이지네이션을 할 시 데이터 개수를 어떻게 기대한 1쪽에 맞출 수 있을지 궁금합니다
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]여기에 질문 내용을 남겨주세요.1:N 관계에서 1을 기준으로 페이지네이션 조회에 대해 질문드립니다.강의에서는 N을 기준으로 조회lazy loading을 이용한 성능을 포기한 조회@BatchSize를 이용한 방법 이 세 가지가 제안되었습니다.만약 이 페이지네이션에서 강의 초반부 예시처럼 N쪽에 조건문이 걸려야 해서 그에 대한 결과물을 가져와야 하는 경우E.g. where m.age = 10 1번 방법으로 조회를 해야할 것 같은데1번 방법에서 N:1임에도 1 입장에서 페이지네이션 개수 그대로 데이터를 추출할 수 있는 방법이 떠오르지 않아 질문드립니다. N:1로 바꿔서 PAGE_SIZE를 10이라고 가정할 때 조회 (memberId가 10개가 나온다) teamId:1, memberId:1 teamId:1, memberId:2 teamId:1, memberId:3 teamId:2, memberId:4 teamId:2, memberId:5 teamId:2, memberId:6 teamId:2, memberId:7 teamId:3, memberId:8 teamId:3, memberId:9 teamId:3, memberId:10 실제 기대하는 조회 (team 이 10개가 나오기를 기대) teamId:1, memberId:1 teamId:1, memberId:2 teamId:2, memberId:3 teamId:2, memberId:4 teamId:3, memberId:5 teamId:3, memberId:6 teamId:4, memberId:7 teamId:5, memberId:8 teamId:5, memberId:9 teamId:5, memberId:10 teamId:6, memberId:11 teamId:6, memberId:12 teamId:7, memberId:13 teamId:7, memberId:14 teamId:8, memberId:15 teamId:8, memberId:16 teamId:8, memberId:17 teamId:9, memberId:18 teamId:9, memberId:19 teamId:10, memberId:20 teamId:10, memberId:20
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
기본 키 매핑
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]기본 키 매핑에서 @GeneratedValue 전략으로 IDENTITY, SEQUENCE, TABLE, AUTO의 특징은 이해했습니다. 하지만 어떤 경우에 어떤 전략이 유리할지 모르겠습니다. AUTO를 사용하지 않고 명시적으로 IDENTITY 또는 SEQUENCE 전략을 채택해야하는 경우가 있을까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
식별자의 의미
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]값타입에는 식별자가 없다고 하는데그래서 식별자가 뭔가요? 식별하는 id같은거라고 생각하고 있는데 정확히 무슨의미로 넣어뒀는지 그리고 식별자의 의미를 모르겠습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
member.getAddressHistory().add(new ~~~) 는 getter는 조회용
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]member.getAddressHistory().add(new ~~~) 는 getter는 조회용으로 쓰는걸로 아는데 .add해서 값을 변경할 수 있나요?getAddressHistory()는 AddressHistory()를 조회한다. 근데.add를 통해서 넣는다.... 뭔가요?뭔가 생략된 부분이 많아서 해깔리네요.. 이번강의는 굉장히 어렵네요
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
mapped by 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]mapped by를 one to many에서 해줘야하는지many to one에서 해줘야하는지 계속 해깔리는데이걸 쉽게 생각하는방법이 없을까요? 만약에 외래키로 가지고 오는건 many to one 이니외래키로 가지고 온건 실체고 반대쪽은 one to many이니 mapped by를 해줘야 한다.인거 같은데 만약에 mapped by를 안쓰면 어떻게 되는건가요? mapped by의 정의가 뭔가요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
테이블 컬럼 생성 순서 문의
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]위와 같이 소스를 구성하고 생성 시 age가 맨 처음에 생성됩니다.검색해보니 알파벳 순으로 만들어진다고는 하는데pk또한 순서가 밀려서 문의드립니다 <property name="hibernate.show_sql" value="true"/> <property name="hibernate.format_sql" value="true"/> <property name="hibernate.use_sql_comments" value="true"/> <property name="hibernate.jdbc.batch_size" value="10"/> <!--쓰기지연 SQL에 저장될 개수, 버퍼--> <property name="hibernate.hbm2ddl.auto" value="create" />설정은 위와 같습니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
다대다 관계에 대해서 몇가지 질문드립니다.
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]비지니스 요구 사항에 맞게 엔티티를 설계할 때 비지니스가 복잡하고 현실과 맞게 설계하기 위해서 고민하다 보니 다대다 관계가 많아지는 것 같습니다 배운대로 OrderItem과 같이 모두 중간에 엔티티를 만들어 1대다로 바꾸었습니다만 몇가지 의문이 드는 부분이 있어서 질문드립니다. 다대다 관계를 위해 중간 엔티티와 테이블을 만들다 보니 의미없는 엔티티와 테이블이 많아지는 것 같습니다. 이런 경우 설계가 잘못되었다고 판단할 수 있나요OrderItem과 같은 중간 엔티티에 대한 리포지토리를 만들면 조회가 편해지고 조인 횟수를 줄일 수 있을 것 같습니다. 그런데 이런 것은 설계적으로 바람직하진 않은가요? 언제나 답변 감사합니다
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
실전예제 1 - 요구사항 분석과 기본 매핑에서 단축키 질문
학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.1. 강의 내용과 관련된 질문을 남겨주세요.2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.(자주 하는 질문 링크: https://bit.ly/3fX6ygx)3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오) 예2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오) 예3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오) 예[질문 내용]안녕하세요! 강의 9분 8초 쯤에 이거 단축키 어떤 키 쓰신걸까요 ?? 알고싶습니다 ㅜㅜ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
트랜잭션에 대해서 질문있습니당 ㅠㅠ
[질문 내용]동시성 문제를 공부하던 중 한 트랜잭션 내에서A 와 C 의 중간테이블인 B 를 저장 이후 C의 칼럼을 변경감지를 통해 업데이트하려고 수정하는 상황입니다 찾아보니B를 저장할 때 외래키인 C 에 대해 SLock 을 걸더군요!디버깅해보니@Transactional이 속한 범위 내에서는 쭉 C에 대해 SLock 을 걸더라고요! 근데 제가 알기로 C 에 대해 update 쿼리가 날라갈 때는 XLock 을 거는 걸로 알고있거든요! 결국 C에 대해 @Transactional 이 종료될 언저리 쯤,즉 변경 감지를 통해 C에 대해 update 쿼리가 날라갈때 SLock 에서 XLock 이 되는 과정을 직접 눈으로 보고 싶은데 혹시 어느 클래스의 어떤 메소드에서변경감지를 통해 flush 를 하고 commit 을 하는지 알려주실 수 있을까요??
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPA flush 와 commit 의 차이가 뭔지 이해가 안갑니다.
제목 그대로입니다. 블로그 찾아보니 flush 는 영속성 컨텍스트의 내용을 DB에 동기화 시키는 것, 이라고 하고 커밋은 트랜잭션을 종료하는데 쓴다고하더라구요!. @Transactional public void likePost(final Member currentMember,final Long postId){ try{ postLockRepository.getLock(postId.toString()); final Post post = findPost(postId); //post 의 작성자와 좋아요를 누르려는 사람의 ID 값이 같을 떄 예외 if (post.getMember().getId() == currentMember.getId()) { throw new NotFoundException(ErrorCode.MESSAGE_NOT_FOUND); } //이미 눌러져 있을 때 deleteLikePost 수행, 없다면 saveLikePost 수행 likePostRepository.findByMemberIdAndPostId(currentMember.getId(), post.getId()) .ifPresentOrElse(likePost -> { deleteLikePost(likePost, post);}, () -> { saveLikePost(currentMember, post); System.out.println("pp"); }); } finally{ postLockRepository.releaseLock(postId.toString()); } } private void saveLikePost(final Member member,final Post post){ LikePost lp= LikePost.builder() .post(post) .member(member) .build(); likePostRepository.save(lp); System.out.println("gg"); post.increaseLikeCount(); postRepository.saveAndFlush(post); System.out.println("kk"); }이 코드에서 saveLikepost 를 실행하면 post 에 대한 좋아요 가 하나 증가합니다. 그리고 saveAndFlush를 통하면 update 쿼리가 바로 나가더라구요!. 이 같이 쿼리를 발생시키고 flush 를 했으니 영속성 컨텍스트에 있는 post 의 like_count 는 1이 증가되어야 합니다. 또한 likePostRepository.save() 도 역시 insert 쿼리가 나가고요!질문 요약: 저희가 알고있는 개념대로라면 영속성 컨텍스트에 있는 @Transactional 안에 있는 Save를 한 대상(LikePost) 와 @Transactional 안에 있는 SaveFlush 대상 역시 FLUSH를 통해 DB와 동기화 시킨다고 생각했습니다. (DB에 동기화시켰으니까 insert 하는 대상은 DB에 생겨야 하고, update 한 거는 update 가 제대로 반영이 되어야 한다고 생각했습니다) 그런데 위 과정에서 디버깅을 해보니(하이버네이트로 쿼리가 날라가는 것은 확인이 되었습니다) 실제 DB에 데이터가 들어가지 않고 @Transactional 이 끝나야 DB에 반영이 되더라고요!! 제가 동기화에 대해 이해를 잘 못하고 있는 걸까요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
No Persistence provider for EntityManager named hello
[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)[질문 내용]실전예제1을 따라하다가이런 에러가 나는데 이유를 모르겠어요,, 어떻게 하면 해결할 수 있을까요? 그리고 h2DB 연결도 안되어서 찾아봤더니url을 jdbc:h2:~/jpashop 이렇게 하면 된다고 해서 이렇게 해서 db접속을 했고,persistence.xml에도 url을 위와 동일하게 설정해두었습니다.프로젝트 압축파일 구글드라이브에 올려놓았습니다!도움 부탁드립니다.https://drive.google.com/file/d/1S5ytUHGS0cpr7LSvlFF5E8qyiTwjlOs-/view?usp=sharing
- 해결됨자바 ORM 표준 JPA 프로그래밍 - 기본편
DB 자동 생성 기능이 동작하지 않습니다 도와주세요ㅠㅠㅠ
예제로 올려주신 ex1-hello-jpa가 Maven 기반으로 되어있어서 Gradle 기반의 예제로 학습해보기 위해 최대한 비슷한 예제 파일을 만들었습니다. 하지만 이 예제에서는 애플리케이션 실행 시 DB 자동 생성 관련 부분이 아예 동작하지 않습니다. (로그도 뜨지 않고, 실제로 쿼리도 수행되지 않습니다.)프로젝트를 암만 뒤져봐도 JDBC 연결 정보도 다 전달했고, @Entity까지 다 했는데 왜 동작을 안 하는지 정말 모르겠습니다.https://drive.google.com/file/d/1epXZLqjRw8ssBAv6zKaVM7T7IpQ24hPW/view?usp=sharing프로젝트 파일 링크입니다. 고수분들 도와주시면 정말 감사하겠습니다 ㅠㅠㅠ
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
merge과 remove, cascade에 대한 질문
=========================================[질문 템플릿]1. 강의 내용과 관련된 질문인가요? (예/아니오)2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)[질문 내용]코드 먼저 보여드리겠습니다public void execute(){ EntityManager em = entityManagerFactory.createEntityManager(); EntityTransaction tx = em.getTransaction(); try { tx.begin(); Writing writing = new Writing("A"); Image image1 = new Image("order1"); Image image2 = new Image("order2"); image1.setWriting(writing); image2.setWriting(writing); writing.getImageList().add(image1); writing.getImageList().add(image2); em.persist(writing); em.flush(); em.clear(); Writing findWriting = em.find(Writing.class, writing.getId()); List<Image> imageList = findWriting.getImageList(); for (Image image : imageList) { em.remove(image); // 실행? 실행안됨? } System.out.println("=============persist start =============="); em.persist(image1); System.out.println("=============persist stop =============="); tx.commit(); }catch (Exception e){ e.printStackTrace(); tx.rollback(); }finally { em.close(); } }public class Writing { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "writing_id") private Long id; @Column(name = "writing_name") private String name; @OneToMany(mappedBy = "writing", cascade = CascadeType.ALL) private List<Image> imageList = new ArrayList<>();public class Image { @Id @GeneratedValue @Column(name = "order_id") private Long id; private String OrderName; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "writing_id") private Writing writing; public Image(String orderName) { OrderName = orderName; } }제가 여기서 궁금한건, for (Image image : imageList) { em.remove(image); // 실행? 실행안됨? } 이 부분부터 인데,Cascade.ALL로 설정해서, Writing과 image가 객체 관 연관관계가 설정되어 있기때문에 cascade 입장에서는 persist 하려하고, em.remove 입장에서는 삭제하려하기에 충돌이 일어나서 결국 삭제되지 않는 건 이해 했습니다.이때 em.clear로 영속성 컨텍스트에 있는 writing와 image1, image2가 현재 detached된 상태가 맞다고라고 가정하고 제 질문은 다음과 같습니다.1. em.remove(image) 자체의 코드가 "실행"은 되어서 detached된 image1, image2를 removed, 즉 영속성 컨텍스트에서 아에 제거 된 상태로 만든다라고 이해한게 맞는지?2.그리고 detached된 엔티티이든, persist 되어있는 엔티티이든 둘 다 remove 하면 결과값은 "영속성 컨텍스트에서 제거"라는 것으로 똑같은지?3. 만약 removed가 되어있다고 하면, em.persist가 다음과 같은 오류와 함께 실행 안되는 이유... 다음 에러에는 detached된 엔티티는 persist 할 수 없다는데 그렇다면 실제로 remove 된게 아닌지? 그렇다기엔 em.merge(image1)를 하면 새로운 객체를 생성해서 DB 에 저장하는데 ㅠ =============persist start ==============jakarta.persistence.EntityExistsException: detached entity passed to persist: com.example.jpatest.entity.Image...
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
JPQL과 SQL 차이가 잘 이해가 안갑니다.
JPQL은 엔티티 객체를 대상으로 쿼리한다고 하고 SQL은 DB 테이블을 대상으로 쿼리한다고 하시는데이 말이 잘 이해가 안 갑니다. Jpql을 통해 결국 SQL을 생성하는것도 이해했고 Jpql이 특정 DB에 종속적이지 않다는 말도 이해했습니다. 다만 검색 쿼리로서 Jpql의 용도를 하기 위해서는 Jpql도 결국 DB 테이블을 대상으로 쿼리를 하는게 아닌가요?엔티티 객체를 대상으로 쿼리를 한다는 말이 잘 이해가 안갑니다. 엔티티 객체라는 말 자체가 혼동이 됩니다.저는 평소 엔티티라는 말을 RDB 관점에서 다른것들과 구별을 가지는 DB에서의 클래스 정도로 이해하고 있습니다. 여기 JPA강의에서 엔티티는 @Entity 어노테이션을 통해 JPA에서 관리하고 RDB의 테이블과 1대1로 매칭되는 단위 정도로 이해하고 있습니다. 거기다가 객체라는 용어도 평소 프로그래밍에서 쓰던대로 클래스를 구현한 실체정도로 생각한다면, 여기 JPA강의에서 엔티티 객체라는 말은 한 번이라도 영속화를 시켜준 실체라고 이해해야 하나요? 정확한 정의가 궁금합니다.
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
1차 캐시와 트랜잭션 격리 수준 관련 질문
안녕하세요. 자바 ORM 표준 JPA 프로그래밍 책으로 학습 중에 "1차 캐시를 통해 Repeatable Read 수준의 트랜잭션 격리 수준을 제공한다"는 내용을 보고 궁금증이 생겨 질문 남깁니다. 격리 수준이 Read-Committed와 Repeatable Read인 경우, 언두 로그를 이용한 MVCC로 한 트랜잭션 내에서 반복적인 읽기를 보장한다고 알고 있습니다.하지만 이 둘을 성능 관점에서 봤을 때 언두 로그에 있는 Row를 삭제하는 범위가 달라져 상대적으로 Repetalbe Read가 성능이 더 안 좋다고도 알고 있습니다.결과적으로 1차 캐시를 통해 애플리케이션 레벨에서 Read Committed를 보장해 주는데, 굳이 MySQL 서버에서는 불필요하게 언두 로그에 더 많은 Row를 저장하면서까지 Repetable Read를 설정할 필요가 없다고 생각이 됐습니다. 따라서 MySQL 8.0 기준으로 JPA를 사용하면, 트랜잭션 격리 수준을 Repetable Read로 설정하지 않아도 되나요?
- 미해결자바 ORM 표준 JPA 프로그래밍 - 기본편
대리키와 복합키 관련하여 질문 있습니다.
안녕하세요. ORM 설계를 진행할 때 비식별 관계를 사용하고 기본 키는 Long 타입의 대리 키를 사용하는 것을 추천한다고 책에서 읽었습니다. 장바구니, 위시리스트 테이블을 설계 할때도 대리 키를 사용는 것이 좋을까요?아니면 사용자 ID, 상품 ID로 복합키를 사용하는 것이 좋을까요? 어떤 상황에서 복합키를 적절하게 사용해야 하는지 판단을 하지 못하겠습니다.아니면 신규 테이블을 설계할 때는 전부 대리 키를 사용하는 것이 적절 할까요? 그리고 대리 키를 사용할 때 한가지 더 궁금한 부분이 있습니다.대리 키는 비즈니스와 아무 관련이 없다고 하셨는데, 이 부분이 잘 와닿지 않아서요..실제 비즈니스와 관련있는 키가 있는건지.. 아니면 비즈니스에서 사용하는 키를 따로 추가로 생성하고대리 키로는 조회, 수정, 삭제를 진행하면 안되는걸까요? 감사합니다.