[스프링(spring)] JPA 복합키와 EntityManger

allnight5·2023년 1월 31일
0

JPA

목록 보기
5/5

JPA란 무엇인가?

  • 자바 ORM 기술에 대한 표준 명세로, JAVA에서 제공하는 API이다. 스프링에서 제공하는 것이 아님!
  • ORM이기 때문에 자바 클래스와 DB테이블을 매핑한다.(sql을 매핑하지 않는다)
@Repository
public class TestRepository<T>{
	//아무것도 없는 상태가 아닌 gradle에서 의존성 주입 필요
    //@PersistenceContext와 EntityManger둘다
	@PersistenceContext
    EntityManger entityManager;
    
    public T insertContext(T t){
    	entityManger.persist(t);
        return t;
    }
    public T selectT(Long id){return entityManager.find(T.class, id);}
}

FK 2개 - 복합키 (PK 없이)

  • 복합키를 선언하는 방법은 2가지가 있습니다.
  1. @IdClass를 활용하는 복합키는 복합키를 사용할 엔티티 위에 @IdClass(식별자 클래스) 사용
  2. @EmbeddedId를 활용하는 복합키는 복합키 위에 @EmbeddedId 사용

1. @IdClass를 활용하는 복합키는 복합키를 사용할 엔티티 위에 @IdClass(식별자 클래스) 사용

@IdClass UserChannelId

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class UserChannelId implements Serializable {
  private Long user;   // UserChannel 의 user 필드명과 동일해야함
  private Long channel; // UserChannel 의 channel 필드명과 동일해야함

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    UserChannelId userChannelId = (UserChannelId) o;
    return Objects.equals(getUser(), userChannelId.getUser()) && Objects.equals(getChannel(), userChannelId.getChannel());
  }

  @Override
  public int hashCode() {
    return Objects.hash(getUser(), getChannel());
  }
}

@IdClass UserChannel

@Entity
@IdClass(UserChannelId.class)
public class UserChannel { 
  @Id
  @ManyToOne
  @JoinColumn(name = "user_id")
  User user;

  @Id
  @ManyToOne
  @JoinColumn(name = "channel_id")
  Channel channel; 
}

@EmbeddedId를 활용하는 복합키는 복합키 위에 @EmbeddedId 사용

embeddable UserChannelId

@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Embeddable
public class UserChannelId implements Serializable {

  @Column(name = "user_id")
  private Long userId;

  @Column(name = "channel_id")
  private Long channelId;

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    UserChannelId userChannelId = (UserChannelId) o;
    return Objects.equals(getUser(), userChannelId.getUser()) && Objects.equals(getChannel(), userChannelId.getChannel());
  }

  @Override
  public int hashCode() {
    return Objects.hash(getUser(), getChannel());
  }
}

embeddable UserChannel

@Entity
public class UserChannel {

  @EmbeddedId
  private UserChannelId userChannelId; 

  @ManyToOne
  @MapsId("user_id")
  User user;

  @ManyToOne
  @MapsId("channel_id")
  Channel channel; 

}
profile
공부기록하기

0개의 댓글