엔티티 매핑 소개
- 객체와 테이블 매핑 : @Entity, @Table
- 필드와 컬럼 매핑 : @Column
- 기본 키 매핑 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity가 붙은 클래스는 JPA가 관리하는 엔티티임
속성 : name
-> JPA에서 사용할 엔티티 이름을 지정
-> 기본값 : 클래스 이름을 그대로 사용한다.
-> 같은 클래스 이름 없으면 가급적 기본값을 사용한다.
-> 기본값을 쓸 것
주의사항
-> 기본 생성자 필수( 파라미터가 없는 public 또는 protected 생성자)
-> final 클래스, enum, interface, inner 클래스 사용 X
-> 저장할 필드 final 사용 X
DDL 생성 기능
- 제약조건 추가 : 회원 이름은 필수, 10자 초과 X
->@Column(nullable=false, length=10)- 유니크 제약조건 추가
->▶ DDL 생성 기능은 DDL을 자동 생성할 때만 사용되고 JPA의 실행로직에는 영향을 주지 않는다.@Table(uniqueConstraints={ @UniqueConstraint(name="NAME_AGE_UNIQUE", columnNames={"NAME", "AGE"} ) })
@SequenceGenerator
- name : 식별자 생성기 이름
- sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
- initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다.(기본값 1)
- allocationSize : 시퀀스 한 번 호출에 증가하는 수
(데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면 이 값을 반드시 1로 설정해야 한다.)(기본값 50)- catalog, schema : 데이터베이스 catalog, schema
→ 방향(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();
}
}