JPA

Spring Data JPA

[JPA] 연관관계 매핑_일대일(1:1) - 경험을 기록하는

일대일각 엔티티는 상대 엔티티와 하나의 관계만을 가집니다. 데이터베이스에서는 외래키에 UNIQUE 제약조건이 추가된 상황 사용 예시Member@Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "MEMBER_ID") private Long id; @Column(name = "USERNAME") private String username; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "TEAM_ID") private Team team; @OneToOne @JoinColumn(name = "LOCKER_ID") p..

Spring Data JPA

[JPA] 연관관계 매핑_일대다(1:N) - 경험을 기록하는

일대다(1:N)한 엔티티의 인스턴스가 다른 엔티티의 여러 인스턴스와 연관되는 관계예) 한 명의 작가가 여러 권의 책을 쓸 수 있는 경우 '일' 쪽에서 외래키를 관리객체입장에서 TEAM에서 외래키를 관리, 데이터베이스는 '다' 쪽에서 외래키를 관리한다. Team@Entity public class Team { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "TEAM_ID") private Long id; private String name; @OneToMany @JoinColumn(name = "TEAM_ID") private List members = new ArrayList();위 코드를 보면 일대다 관계에서 '일..

Spring Data JPA

[JPA] 연관관계 매핑_다대일(N:1) - 경험을 기록하는

연관관계 매핑에는 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)가 있습니다. 이번 포스팅에서는 다대일(N:1)에 대해서 알아보겠습니다.다대일(N:1)가장 많이 사용되는 연관관계 매핑 중 하나한 엔티티의 여러 인스턴스가 다른 엔티티의 단일 인스턴스와 연관되는 관계예) 여러 주문이 하나의 회원에 속하는 경우양방향 연관관계의 경우 "다" 쪽이 주인이 됩니다.사용 상황부모-자식: 부서와 직원, 카테고리와 제품 등의 관계주문-고객: 여러 주문이 하나의 고객에 속하는 경우블로그 포스트- 작성자: 여러 포스트가 하나의 작성자에 속하는 경우사용 빈도실제 비즈니스 도메인에서 이러한 관계가 매우 흔하기 때문에 가장 많이 사용되는 연관관계 매핑이다.장점단순하고 이해하기 쉬운 관계양방향 매핑 시 객체 ..

Spring Data JPA

[JPA] 양방향 연관관계와 연관관계의 주인 - 2 - 경험을 기록하는

저번 포스팅에서는 양방향 연관관계의 기본적인 부분에 대해서 알아보았습니다.이번에는 양방향 연관관계를 맺을 때 주의해야 할 점에 대해서 알아보겠습니다.모든 코드는 Github 에 올라와있습니다.양방향 매핑 시 자주 하는 실수mappedBy 된 변수에 값을 입력하려고 한다.분명히 team.getMembers()를 통해서 값을 넣어줬다. 하지만 H2 DB에 가서 조회를 해보면?Member 테이블에 TEAM_ID = null인걸 확인할 수 있다. 값이 들어가지 않은 것이다.team.getMember.add(member)로 값을 넣어줬지만 왜 값이 들어가지 않은 것일까?기본적으로 mappedBy 속성이 붙은 변수는 JPA에서 조회 용도로 사용된다.member에 team을 넣고 싶다면 member.setTeam(t..

Spring Data JPA

[JPA] 양방향 연관관계와 연관관계의 주인 - 1 - 경험을 기록하는

이전 포스팅의 단방향 연관관계에서 더 발전시켜서 양방향으로 만들어보겠습니다.모든 코드는 Github에 올라와 있습니다.양방향 연관관계두 엔티티가 서로를 참조하는 관계 회원과 팀 예시회원과 팀이 있다.회원은 하나의 팀에 소속된다.하나의 팀은 여러 회원을 가지고 있다.Member와 Team을 양방향 연관관계로 만들어도 DB입장에서는 Table 변화가 없습니다.DB에서는 Foreign Key를 가지고 Join 해서 데이터를 가지고 오기 때문에 A, B 테이블 상관없이 한쪽에만 Foreing Key가 있으면 됩니다.MemberMember 엔티티는 단방향 연관관계 와 차이가 없습니다....@Entity public class Member { @Id @GeneratedValue(strategy = Genera..

Spring Data JPA

[JPA] 단방향 연관관계 - 경험을 기록하는

모든 코드는 Github에 올라와 있습니다.단방향 연관관계 A엔티티가 B엔티티를 참조하지만 B엔티티는 A엔티티를 참조하지 않는 경우 엔티티의 참조가 한쪽 방향으로만 있는 경우 회원과 팀 예시로 알아보기회원과 팀이 있다.회원은 팀을 참조지만, 팀은 회원을 참조하지 않는다.회원과 팀은 다대일 관계다.객체지향에서는 객체가 다른 객체의 참조를 가지고 있으므로 자유롭게 객체 간 탐색을 할 수 있습니다. Member Member에서 Team의 id를 가지고 있는 것이 아니라 Team의 참조를 가지고 있습니다.... @Entity public class Member { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "MEMBER_ID") pri..

Spring Data JPA

JPA 매핑 - 기본 키

기본 키 매핑 어노테이션@Id@GeneratedValueIDENTITY 전략 - 특징기본 키 생성을 데이터베이스에 위임주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용JPA는 보통 트랜잭션 커밋 시점에 INSERT SQL 실행AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후 ID값을 알 수 있음IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회SEQUENCE 전략 - 특징데이터베이스 시퀀스는 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트(예: 오라클 시퀀스)오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용SEQUENCE - @SequenceGenerator주의 : ..

Spring Data JPA

JPA 매핑 - 필드와 컬럼

자바와 DB의 데이터 타입이 다른 것들이 있기 때문에 이 데이터를 어노테이션을 사용해서 맞춰줘야 합니다.매핑 어노테이션어노테이션설명@Column컬럼 매핑@Temporal날짜 타입 매핑@Enumeratedenum 타입 매핑@LobBLOB, CLOB 매핑@Transient특정 필드를 컬럼에서 제외@Column객체 필드와 테이블 컬럼 매핑에 사용속성설명기본값name필드와 매핑할 테이블의 컬럼 이름객체 필드명insertableupdatable등록, 변경 가능 여부를 설정TRUEnullable(DDL)null값의 허용 여부를 설정, false 설정시 not null unique(DDL)@Table의 uniqueConstraints과 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. columnDefin..

Spring Data JPA

JPA의 DB스키마 자동 생성

JPA가 매핑 정보를 보고 애플리케이션 로딩 시점에 자동으로 DB스키마를 생성하고 테이블에 데이터를 알아서 넣는다.데이터베이스 스키마 자동 생성속성설명create기존의 테이블이 존재하면 삭제하고 생성create-dropcreate와 같지만 마지막에 table을 삭제update엔티티와 매핑 테이블이 없다면 생성, 테이블이 있다면 컬럼을 변경validate엔티티 클래스와 테이블이 정상 매핑되는지만 검사none(default)아무 설정도 안함사용법persistence.xml ... ... application.propertiesspring.jpa.hibernate.ddl-auto=옵션applicat..

Spring Data JPA

객체와 테이블 매핑

엔티티 매핑 어노테이션@Entity, @Table: 객체와 테이블 매핑@Column: 필드와 컬럼 매핑@Id: 기본 키 매핑@ManyToOne, @JoinColumn, ...: 연관관계 매핑@EntityJPA가 관리하는 클래스, 엔티티라 합니다. Table과 직접적으로 매핑되는 클래스주의기본 생성자 필수(public 또는 protected 생성자)final, enum, interface, inner 클래스 사용 금지저장할 필드에 final 사용 금지final 클래스와 필드 사용 제한JPA에 프록시를 사용해서 런타임에 동적 프록시를 생성하여 지연 로딩(Lazy Loading)을 지원하는데, final 키워드는 상속, 오버라이드를 제한하기 때문에 JPA에서 프록시로 클래스를 생성하는 것을 막습니다.Enum ..

여행하는 개발자(SOO)
'JPA' 태그의 글 목록