Spring Data JPA で複合キーを扱う
今回は Spring Data JPA で複合キーを扱ってみたいと思います.
主キー1つであればなんの迷いもなく以下のように記述できます.
package com.example.app.domain.model.entity;
import com.example.app.domain.model.entity.key.FavoriteSessionKey;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "favorite_session")
@Data
@AllArgsConstructor
public class FavoriteSessionEntity {
@Id
@Column(name = "session_id")
private String sessionId;
}
JPA Repository に Entity と 主キーの型を指定します.
これが複合キーになると多少の変更が必要になります.
まずは Entity の変更についてです.
ユーザーIDとセッションIDを定義した FavoriteSessionKey を作成しました.
こちらのクラスが主キーに該当します.
クラスには @Embeddable を付与します.
package com.example.app.domain.model.entity;
import com.example.app.domain.model.entity.key.FavoriteSessionKey;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Entity
@Table(name = "favorite_session")
@Data
@AllArgsConstructor
public class FavoriteSessionEntity {
@EmbeddedId
private FavoriteSessionKey favoriteSessionKey;
}
Entity 側には @EmbeddedId を付与した主キーを宣言しています.
Repository の部分です.
package com.example.app.domain.repository;
import com.example.app.domain.model.entity.FavoriteSessionEntity;
import com.example.app.domain.model.entity.key.FavoriteSessionKey;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface IFavoriteSessionRepository extends JpaRepository {
public List findByFavoriteSessionKeyUserId(String userId);
}
ジェネリクスの宣言の仕方が FavoriteSessionEntity, FavoriteSessionKey という風になります.
また、主キーの中のうち、1つを検索する場合は、findByFavoriteSessionKeyUserId というような命名のメソッドになります.
命名は少し特殊ですが、これで単一キーでの検索が実現できました.
以上です.