데이터베이스에는 두 개의 테이블인 User와 Challenge가 있고, 이 두 테이블은 N:N 관계를 가지고 있다고 가정
CREATE TABLE user (
user_id BIGINT PRIMARY KEY,
username VARCHAR(255) NOT NULL,
email VARCHAR(255) NOT NULL
);
CREATE TABLE challenge (
challenge_id BIGINT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT
);
CREATE TABLE challenge_user (
challenge_id BIGINT NOT NULL,
user_id BIGINT NOT NULL,
PRIMARY KEY (challenge_id, user_id),
FOREIGN KEY (challenge_id) REFERENCES challenge (challenge_id),
FOREIGN KEY (user_id) REFERENCES user (user_id)
);
@EmbeddedId 사용하여 복합키 구현먼저 복합키를 정의하기 위해 ChallengeUserId 클래스를 작성합니다.
import jakarta.persistence.Embeddable;
import java.io.Serializable;
import java.util.Objects;
@Embeddable
public class ChallengeUserId implements Serializable {
private Long challengeId;
private Long userId;
// 기본 생성자
public ChallengeUserId() {}
// 매개변수 있는 생성자
public ChallengeUserId(Long challengeId, Long userId) {
this.challengeId = challengeId;
this.userId = userId;
}
// Getters and Setters
public Long getChallengeId() {
return challengeId;
}
public void setChallengeId(Long challengeId) {
this.challengeId = challengeId;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
// equals()와 hashCode() 반드시 구현
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
ChallengeUserId that = (ChallengeUserId) o;
return Objects.equals(challengeId, that.challengeId) && Objects.equals(userId, that.userId);
}
@Override
public int hashCode() {
return Objects.hash(challengeId, userId);
}
}
import jakarta.persistence.*;
import java.util.Date;
@Entity
@Table(name = "challenge_user")
public class ChallengeUser {
@EmbeddedId
private ChallengeUserId id;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("challengeId")
@JoinColumn(name = "challenge_id")
private Challenge challenge;
@ManyToOne(fetch = FetchType.LAZY)
@MapsId("userId")
@JoinColumn(name = "user_id")
private User user;
private Date joinedAt;
// 기본 생성자
public ChallengeUser() {}
// 매개변수 있는 생성자
public ChallengeUser(ChallengeUserId id, Challenge challenge, User user, Date joinedAt) {
this.id = id;
this.challenge = challenge;
this.user = user;
this.joinedAt = joinedAt;
}
}
User 엔터티에서 다대다 관계를 매핑합니다.@Entity
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
private String username;
private String email;
@OneToMany(mappedBy = "user", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ChallengeUser> challengeUsers = new HashSet<>();
}
Challenge 엔터티에서 다대다 관계를 매핑합니다.@Entity
@Table(name = "challenge")
public class Challenge {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long challengeId;
private String name;
private String description;
@OneToMany(mappedBy = "challenge", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
private Set<ChallengeUser> challengeUsers = new HashSet<>();
// Getters and Setters
}