SpringBootの複合キーを用いて自動採番をしたいです。
String型のListをリクエストとして受け取り、1つのIDで、sequenceを割り振りテーブルに格納したいです。
sequenceは毎回1からスタートであるため、自動採番せずfor文の中でセットしていますが、
idは一回のfor文の間は同じ値をセットしたいと考えています。
・複合キーの場合@GeneratedValue(strategy=GenerationType.IDENTITY)を利用して自動採番する方法
・上記不可能の場合、テーブルで保持しているidの一番最後の部分を取得する方法はあるのか?
を教えていただきたいです。よろしくお願いいたします。
▫️テーブルは以下のようなイメージです。idとsequenceが主キー。
id | sequence | name |
---|---|---|
1 | 1 | "aaa" |
1 | 2 | "bbb" |
1 | 3 | "ccc" |
2 | 1 | "ddd" |
2 | 2 | "eee" |
2 | 3 | "fff" |
▫️永続化処理です
java
1List<Activeword> activewordList = new ArrayList<Activeword>(); 2 3// リクエストのリスト(String)をループでオブジェクト作成しリストに追加する 4for (int i = 0; i < request.getActivewords().size(); i++) { 5 Activeword activeword = new Activeword(); 6 activeword.setActivewordSequence(i + 1); 7 activeword.setActivewordName(request.getActivewords().get(i)); 8 activewordList.add(activeword); 9} 10// リクエストが["aaa", "bbb", "ccc"]の場合 11// id: 1, sequence: 1, name: "aaa" 12// id: 1, sequence: 2, name: "bbb" 13// id: 1, sequence: 3, name: "ccc" 14// をテーブルに格納したい。 15activewordRepository.saveAll(activewordList); // 永続化処理
▫️テーブルのモデル
java
1@Entity 2@Table(name = "activeword") 3@IdClass(ActivewordPK.class) 4public class Activeword { 5 6 @Id 7 @GeneratedValue(strategy=GenerationType.IDENTITY) 8 private Integer activewordId; 9 @Id 10 private Integer activewordSequence; 11 private String activewordName; 12}
▫️Primary key用のクラス(qiitaからパクったがseializableがなぜ必要なのかわかっていません)
java
1public class ActivewordPK implements Serializable { 2 private static final long serialVersionUID = 1L; 3 4 private Integer activewordId; private Integer activewordSequence; 5} 6
▫️リクエストのモデルクラス
java
1public class ActivewordRequest { 2 3 private List<String> activewords; 4 5 public List<String> getActivewords() { 6 return activewords; 7 } 8 9 public void setActivewords(List<String> activewords) { 10 this.activewords = activewords; 11 } 12}
▫️リポジトリ
java
1@Repository 2public interface ActivewordRepository extends JpaRepository<Activeword, ActivewordPK>{ 3}
あなたの回答
tips
プレビュー