[JPA-4] 매핑-1

김아람·2024년 7월 17일
post-thumbnail

엔티티 매핑 소개

  • 객체와 테이블 매핑 : @Entity, @Table
  • 필드와 컬럼 매핑 : @Column
  • 기본 키 매핑 : @Id
  • 연관관계 매핑 : @ManyToOne, @JoinColumn

📌 1. 객체와 테이블 매핑

"@Entity"

  • @Entity가 붙은 클래스는 JPA가 관리하는 엔티티임

  • 속성 : name
    -> JPA에서 사용할 엔티티 이름을 지정
    -> 기본값 : 클래스 이름을 그대로 사용한다.
    -> 같은 클래스 이름 없으면 가급적 기본값을 사용한다.
    -> 기본값을 쓸 것

  • 주의사항
    -> 기본 생성자 필수( 파라미터가 없는 public 또는 protected 생성자)
    -> final 클래스, enum, interface, inner 클래스 사용 X
    -> 저장할 필드 final 사용 X

"@Table"

  • 엔티티와 매핑할 테이블 지정
  • name : 매핑할 테이블 이름(엔티티 이름을 사용)
  • catalog : 데이터베이스 catalog 매핑
  • schema : 데이터베이스 schema 매핑
  • uniqueConstraints : DDL 생성시에 유니크 제약 조건 생성

DDL 생성 기능

  • 제약조건 추가 : 회원 이름은 필수, 10자 초과 X
    ->
    @Column(nullable=false, length=10)
  • 유니크 제약조건 추가
    ->
      @Table(uniqueConstraints={	@UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"} )	})
    ▶ DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행로직에는 영향을 주지 않는다.

📌 2. 필드와 컬럼 매핑

  • @Column : 컬럼 매핑
  • @Temporal : 날짜 타입 매핑
  • @Enumerated : enum 타입 매핑
  • @Lob : BLOB,CLOB매핑
  • @Transient : 특정 필드를 컬럼에 매핑하지 않음(매핑 무시)

"@Column"

  • name : 필드와 매핑할 테이블의 컬럼 이름
  • nullable : null값의 허용 여부를 설정한다. false로 설정하면 DDL 생성시에 not null 제약조건이 붙는다.
  • unique : @table uniqueConstraints 와 같지만 한 컬럼에 간단히 유니크 제약 조건을 걸 때 사용한다.
  • length : 문자 길이 제약조건, String 타입에만 사용

📌 3.기본키 매핑 방법

  • 직접 할당 : @Id만 사용
  • 자동 생성 : @GeneratedValue → 전략
    IDENTITY
    : 데이터베이스에 위임
    : MYSQL, SQL Server, DB2
    SEQUENCE
    : 데이터베이스 시퀀스 오브젝트 사용
    : ORACLE, PostgreSQL, DB2, H2
    @SquenceGenerator 사용
    TABLE
    : 키 생성용 테이블 사용, 모든 DB에서 사용
    @TableGenerator 필요
    AUTO
    : 방언에 따라 자동 지정, 기본값
    → AUTO는 DB방언에 맞춰서 IDENTITY, SEQUENCE, TABLE 3개의 방식 중 하나가 선택이 된다.

@SequenceGenerator

  • name : 식별자 생성기 이름
  • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
  • initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다.(기본값 1)
  • allocationSize : 시퀀스 한 번 호출에 증가하는 수
    (데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다.)(기본값 50)
  • catalog, schema : 데이터베이스 catalog, schema

📌 4. 연관관계 매핑 (단방향)

  • 객체와 테이블 연관관계의 차이를 이해
  • 객체의 참조와 테이블의 외래키를 매핑
  • 용어 이해
      → 방향(Direction) : 단방향, 양방향
      → 다중성(Multiplicity) : 다대일(N:1), 일대다(1:N), 일대일(1:1), 다대다(N:M)
      → 연관관계 주인(Owner) : 객체 양방향 연관관계는 관리하는 주인이 필요

연관관계 매핑 전

Member.java

  @Entity
  @Getter @Setter
  public class Member {

      @Id
      @GeneratedValue
      @Column( name = "MEMBER_ID")
      private Long id;
      @Column( name = "TEAM_ID")
      private Long teamId;
      private String username;


  }

Team.java

@Entity
@Getter @Setter
public class Team {

	@Id
	@GeneratedValue
	@Column( name = "TEAM_ID")
	private Long id;
	private String name;
}

JPAMain.java

public class JpaMain {

	public static void main(String[] args) {
		EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
		EntityManager em = emf.createEntityManager();
		
		EntityTransaction tx = em.getTransaction();
		tx.begin();
		
		Team team = new Team();
		team.setName("TeamA");
		
		// 영속상태가 되면 PK의 값이 세팅이 된 후에 영속상태가 된다.
		em.persist(team);
		
		Member member = new Member();
		member.setUsername("member1");
		member.setTeamId(team.getId());
		em.persist(member);
		
		// select
		// 어떤 멤버의 pk 값을 아는 상태에서 그 멤버가 어느팀 소속인지 소속이름을 알고 싶을 때 확인
		Member findMember = em.find(Member.class, member.getId());
		Long findTeamId = findMember.getTeamId();
		Team findTeam = em.find(Team.class, findTeamId);
		System.out.println("findTeam : " + findTeam.getName());
		
		tx.commit();
		em.close();
		emf.close();
	}

}

단방향 연관관계 매핑 후

Member.java(변경)

  @Entity
  @Getter @Setter
  public class Member {

      @Id
      @GeneratedValue
      @Column( name = "MEMBER_ID")
      private Long id;
      private String username;

      /*
       * 1대다의 개념을 객체에게 알려야하는데,
       * DB기준으로 1대다의 개념을 알려줘야한다.
       * @ManyToOne : 여기선 Team이 하나이다.
       * @JoinColumn(name = "TEAM_ID") : 관계 컬럼을 적어준다. TEAM_ID와 조인해야한다.
       *  
       */
      @ManyToOne
      @JoinColumn( name = "TEAM_ID" )
      private Team team;

  }

JPAMain.java(변경)

  public class JpaMain {

      public static void main(String[] args) {
          EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
          EntityManager em = emf.createEntityManager();

          EntityTransaction tx = em.getTransaction();
          tx.begin();

          Team team = new Team();
          team.setName("TeamA");

          // 영속상태가 되면 PK의 값이 세팅이 된 후에 영속상태가 된다.
          em.persist(team);

          Member member = new Member();
          member.setUsername("member1");
          member.setTeam(team);
          em.persist(member);

          // 어떤 멤버의 pk 값을 아는 상태에서 그 멤버가 어느팀 소속인지 소속이름을 알고 싶을 때 확인
          Member findMember = em.find(Member.class, member.getId());
          Team findTeam = findMember.getTeam();
          System.out.println("findTeam : " + findTeam.getName());

          tx.commit();
          em.close();
          emf.close();
      }

  }

0개의 댓글