JPA19 JPA 에서 Where In 절 대신 array_contains를 사용하는 이유 글을 작성한 이유 통합 테스트를 작성하던중 만난 지금까지 와는 다른 SQL 구문에 대해서 궁금점이 생겨서 글을 작성하게 되었습니다. https://github.com/jisu3316/Board-Project GitHub - jisu3316/Board-Project Contribute to jisu3316/Board-Project development by creating an account on GitHub. github.com 도메인 구조는 Post : Like = 1 : N 으로 게시글과 좋아요는 1 대 N으로 정의되어있습니다. @Entity @Where(clause = "deleted = 'N'") @DynamicInsert @DynamicUpdate public class Post extends .. JPA 2023. 10. 17. [JPA] @ManyToMany, 다대다 관계 풀기, 연관 관계 주인 Member 엔티티와 GroupTab 엔티티가 있습니다. 멤버와 모임으로 칭하겠습니다. (GroupTable인데 group이 예약어라서 table을 줄여서 엔티티를 생성하였습니다.) 1. 글 작성 이유 @ManyToMany의 문제점과 이 관계를 일대다 다대일 관계로 풀며 중간 테이블을 추가하는 과정과 그리고 멤버가 모임을 만들면 모임안에는 만든 멤버가 바로 들어가는 로직을 구현하면서 만난 에러를 해결 하게 되어 글을 쓰게 되었습니다. 멤버와 모임은 OneToMany, ManyToOne 관계입니다. 하나의 멤버는 여러 그룹을 생성할 수 있습니다. 그러면 당연히 연관관계의 주인은 FK를 가지고 있는 그룹이 됩니다. @Getter @Entity @NoArgsConstructor(access = AccessLe.. JPA 2022. 8. 19. [JPA] 에러 TransientPropertyValueException: object references an unsaved transient instance TransientPropertyValueException: object references an unsaved transient instance 위와 같은 에러가 콘솔에 찍혔다. 문제 @OneToOne @JoinColumn(name = "group_upload_file_id") private GroupUploadFile groupUploadFile; 위와 같이 연관관계를 맺어놓은 상태였다. 그룹을 만들고 그룹의 배경 사진을 업로드하는 테이블을 만들어 연관관계를 맺어 따로 관리를 하려고 하였다. 근데 에러가 나서 구글링을 해서 찾아보았다. 원인 영속성때문에 나는 오류였다. FK로 사용되는 럼 값이 없는 상태에서 데이터를 넣으려다 발생한 에러라고 한다.. 나 같은 경우에는 그룹에 대한 정보를 받아오는데 파일.. JPA 2022. 8. 11. find vs get (네이밍 컨벤션과 JPA에서의 내부 동작 차이) 프로젝트를 하면서 getReferenceByid라는것을 알았는데요 여기에 대해서 정리해 보도록 하겠습니다. 여기서 getReferenceByid는 findById와 다른데요. 간단하게 알아 보겠습니다. Optional findById(ID id) : 탐색하다. 탐색 결과가 없을 수 있음. 내부 예외 발생 없음. T getOne(ID id) : 가져오다. 가져오려는 대상이 없을 시, 내부에서 예외 발생. (EntityNotFoundException) getOne은 Deprecated 되었고 대신 getReferenceById 가 권장됨. getReferenceById는 EntityManager#getReference 를 사용하며, 조회된 entity 내부값 접근 전까지 lazy loading처리함. Rep.. JPA 2022. 8. 3. [JPA] 값 타입 기본 값 타입 @Entity public class Member { @Id @GeneratedValue private Long id; private String name; private int age; } 위의 Member에서 String, int가 기본 값 타입이다. 해당 값 타입은 회원 엔티티에 의존하며, 공유될 수 없다. 예를 들어 타인의 이름이 바뀐다고 해서, 내 이름까지 바뀌면 안 된다. 임베디드 타입(복합 값 타입) 새로운 값 타입을 직접 정의해서 사용할 수 있는데, JPA에서는 이것을 임베디드 타입이라고 한다. @Entity public class Member { @Id @GeneratedValue priate Long id; private String name; @Embedded priva.. JPA 2022. 6. 19. [JPA] 프록시와 연관 관계 관리 프록시 엔티티를 조회할 때 연관된 엔티티가 항상 사용되는 것은 아니다. ex) 멤버는 팀 엔티티만 연관되어있지만, 멤버의 이름만 가져오길 원할 수 있음. 이때는 굳이 팀 엔티티 정보는 없어도 무방함. JPA는 엔티티가 실제 사용될 때까지 데이터베이스 조회를 지연하는 방법을 제공하는데, 이를 지연 로딩이라고 한다. 지연 로딩을 사용하려면 실제 엔티티 객체 대신에 데이터베이스 조회를 지연할 수 있는 가짜 객체가 필요한데 이것을 프록시 객체라고 한다. 프록시 기초 EntityManager.getReference() 를 호출하면, JPA는 데이터베이스를 조회(쿼리를 날리지 않음)하지 않고 실제 엔티티 객체를 생성하지 않는다. 대신에 데이터베이스 접근을 위임한 프록시 객체를 반환한다. 프록시의 특징 프록시 클래스.. JPA 2022. 6. 19. [JPA] 고급매핑 상속 관계 매핑 • 관계형 데이터베이스는 상속 관계X • 슈퍼타입 서브타입 관계라는 모델링 기법이 객체 상속과 유사 • 상속관계 매핑: 객체의 상속과 구조와 DB의 슈퍼타입 서브타입 관계를 매핑 슈퍼타입 서브타입 논리 모델을 실제 물리 모델로 구현하는 방법 • 각각 테이블로 변환 -> 조인 전략 • 통합 테이블로 변환 -> 단일 테이블 전략 • 서브타입 테이블로 변환 -> 구현 클래스마다 테이블 전략 조인전략 조인 전략은 위 그림과 같이 엔티티 각각을 모두 테이블로 만들고 자식 테이블이 부모 테이블의 기본 키를 받아서 기본 키 + 외래 키로 사용하는 전략이다. 이 전략을 사용할 때 주의할 점은 객체는 타입으로 구분할 수 있지만, 테이블은 타입의 개념이 없으므로 DTYPE 컬럼과 같이 타입을 구분하는 컬럼.. JPA 2022. 6. 18. [JPA] 다양한 연관 관계 매핑 연관관계 매핑시 고려사항 3가지 다중성 단방향, 양방향 연관관계의 주인 다중성 다대일 : @ManyToOne 일대다 : @OneToMany 일대일 : @OneToOne 다대다 : @ManyToMany JPA에서 다중성을 위해 제공하는 어노테이션들이다. 처음에는 헷갈릴수도 있는데 전부다 DB에 매핑하기위해 제공하는것이므로 데이터베이스의 관점에서 생각하면 될것같다. 단방향, 양방향 테이블 • 외래 키 하나로 양쪽 조인 가능 • 사실 방향이라는 개념이 없음 객체 • 참조용 필드가 있는 쪽으로만 참조 가능 • 한쪽만 참조하면 단방향 • 양쪽이 서로 참조하면 양방향 연관관계 주인 • 테이블은 외래 키 하나로 두 테이블이 연관관계를 맺음 • 객체 양방향 관계는 A->B, B->A 처럼 참조가 2군데 • 객체 양방향.. JPA 2022. 6. 18. [JPA] 양방향 연관관계와 연관관계의 주인2- 주의점,정리 이 글은 이전글과 이어지는 글입니다. 양방향 연관관계 매핑시 가장 많이 하는 실수 !! (연관관계의 주인에 값을 입력하지 않음) Team team = new Team(); team.setName("TeamA"); em.persist(team); Member member = new Member(); member.setName("member1"); //역방향(주인이 아닌 방향)만 연관관계 설정 team.getMembers().add(member); em.persist(member); 위와 같이 연관관계의 주인은 member인데 team객체에서 멤버를 참조해서 member를 넣으면 결과가 어떻게 나올까요 ? 결과는 member 테이블 에는 teamID가 null 이 들어갑니다. 그러면 이것을 해결하기위해 어떻.. JPA 2022. 6. 18. [JPA] 양방향 연관관계와 연관관계의 주인 인프런 강의 참고 JPA는 영속성컨텍스트의 매커니즘 이해와 양방향연관관계와 연관관계의 주인을 정해주는 이부분이 가장 헷갈리고 어렵다고 합니다. 왜 어렵냐하면 객체랑 테이블이 두개가 패러다임차이 때문입니다.. 객체는 연관되어있는것들을 '참조'라는것을 사용하고 데이터베이스는 테이블은 '외래키'를 가지고 조인을 활용한다. 두개의 차이와 차이에서오는것을 이해를 해야 연관관계의 주인이라는 개념이라는게 있다는걸 알게되고 이해 할 수 있습니다. 양방향 매핑 테이블 연관관계를 보면 단방향 연관관계에서의 연관관계와 차이가 하나도 없는것을 알 수 있습니다. 멤버에서 팀을알고싶으면 멤버의 TEAM_ID와 팀의 TEAM_ID를 조인하면 되고 팀 테이블에서 우리팀의 멤버가 누가있는지 알고 싶으면 팀의 TEAM_ID와 멤버의 T.. JPA 2022. 6. 15. [JPA] 필드와 컬럼 매핑 요구 사항 정의 1. 회원은 일반 회원과 관리자로 구분해야 한다. 2. 회원 가입일과 수정일이 있어야 한다. 3. 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제 한이 없다. import javax.persistence.*; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; @Entity public class Member { @Id private Long id; @Column(name = "name") private String username; private Integer age; @Enumerated(EnumType.STRING) private RoleType roleType; @Tem.. JPA 2022. 6. 14. [JPA] 플러시란? 플러시란? 플러시는 영속성 컨텍스트의 변경내용을 데이터베이스에 반영하는것입니다. 데이터베이스가 커밋될때 플러시라는게 일어납니다. insert sql이나 delete sql이나 update sql이 DB에 날라가는것을 의미합니다. 영속성 컨텍스트의 변경사항을 DB에 날려주는것을 의미합니다. 플러시 발생 플러시 발생하면 무슨일이 생길까요? 다음 3가지 일이 벌어집니다. 1. 변경감지 2.수정된 엔티티 쓰기 지연 SQL저장소에 등록 3.쓰기지연 SQL 저장소의 쿼리를 데이터 베이스에 전송 ( 등록, 수정 ,삭제 쿼리) 영속성 컨텍스트를 플러시하는 방법 em.flush() - 직접 호출 트랜잭션 커밋 - 플러시 자동호출 JPQL 쿼리 실행 - 플러시 자동 호출 JPQL 쿼리 실행시 플러시가 자동으로 호출되는 이.. JPA 2022. 6. 13. 이전 1 2 다음