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 というような命名のメソッドになります.

命名は少し特殊ですが、これで単一キーでの検索が実現できました.

 

以上です.