前提・実現したいこと
私はJavaおよびSpring Bootに関しては全くの素人で、いろんな資料を参考にしながら作業を進めています。
単一のエンティティを用いて、まったく同じ構成の複数テーブルを動的に切り替えて使用するにはどのようにすればよろしいでしょうか。
発生している問題・エラーメッセージ
あるデーターベースに複数のテーブルがあり、いくつかのテーブルは保存しているデータと名前が違うだけでまったく同じ構成です。
これらをalpha_setおよびbravo_setとします。
alpha_setとbravo_setはid
, name
, uuid
などの属性をもち、それぞれがalpha_attribute, bravo_attributeなど別のテーブルと関連があります(これらのテーブルもまた同じ構成です)。
これらalpha_set
およびbravo_set
テーブルへの問い合わせに関しても、やりたいことは同じなので、URLクエリパラメータによりテーブルの切り替えができないかと考えています。
同じWeb APIを用いて、URLクエリパラメータにより問い合わせ先を変更したいのですが、そのために単一エンティティによる複数テーブルの切り替えができないか、と考えました。
そこで単一の、たとえばXxxSet
などのエンティティを作成し、これに対してパラメータによって問い合わせ先のテーブルを切り替えられれば、と考えました。
たとえば、alpha_set
やbravo_set
に対応するエンティティ(AlphaSet
やBravoSet
)のスーパークラスやインターフェイスとすればよいかとも思ったのですが、どのように実装すればよいか分かりません。
該当のソースコード
実際のソースコードではないのですが、以下のコードで確認しています。
このコードはAlphaSet
への問い合わせを行なっています。
これをURLクエリパラメータによりBravoSet
への問い合わせに切り替えたいのです。
java
1// AlphaSet.java 2package com.example.multitableswitching; 3 4import java.util.Set; 5 6import javax.persistence.Entity; 7import javax.persistence.FetchType; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11import javax.persistence.JoinColumn; 12import javax.persistence.JoinTable; 13import javax.persistence.OneToMany; 14import javax.persistence.Table; 15 16import lombok.AllArgsConstructor; 17import lombok.Data; 18import lombok.NoArgsConstructor; 19 20@Entity 21@Table(name = "alpha_set") 22@Data 23@NoArgsConstructor 24@AllArgsConstructor 25public class AlphaSet { 26 @Id 27 @GeneratedValue(strategy = GenerationType.IDENTITY) 28 private Integer id; 29 30 private String name; 31 32 private String uuid; 33 34 @OneToMany(fetch = FetchType.EAGER) 35 @JoinTable(name = "alpha_set_alpha_attribute", joinColumns = @JoinColumn(name = "set_id"), 36 inverseJoinColumns = @JoinColumn(name = "attribute_id")) 37 private Set<AlphaAttribute> attributes; 38}
java
1// AlphaAttribute.java 2package com.example.multitableswitching; 3 4import java.util.Set; 5 6import javax.persistence.Entity; 7import javax.persistence.FetchType; 8import javax.persistence.GeneratedValue; 9import javax.persistence.GenerationType; 10import javax.persistence.Id; 11import javax.persistence.JoinColumn; 12import javax.persistence.JoinTable; 13import javax.persistence.OneToMany; 14 15import lombok.AllArgsConstructor; 16import lombok.Data; 17import lombok.NoArgsConstructor; 18 19@Entity 20@Data 21@NoArgsConstructor 22@AllArgsConstructor 23public class AlphaAttribute { 24 @Id 25 @GeneratedValue(strategy = GenerationType.IDENTITY) 26 private Integer id; 27 28 private String name; 29 30 @OneToMany(fetch = FetchType.EAGER) 31 @JoinTable(name = "alpha_attribute_type", joinColumns = @JoinColumn(name = "attribute_id"), inverseJoinColumns = @JoinColumn(name = "type_id")) 32 private Set<Type> types; 33}
java
1// AlphaSetRepository.java 2package com.example.multitableswitching; 3 4import org.springframework.data.jpa.repository.JpaRepository; 5import org.springframework.stereotype.Repository; 6 7@Repository 8public interface AlphaSetRepository extends JpaRepository<AlphaSet, Integer> { 9}
java
1// Type.java 2package com.example.multitableswitching; 3 4import javax.persistence.Entity; 5import javax.persistence.GeneratedValue; 6import javax.persistence.GenerationType; 7import javax.persistence.Id; 8 9import lombok.AllArgsConstructor; 10import lombok.Data; 11import lombok.NoArgsConstructor; 12 13@Entity 14@Data 15@NoArgsConstructor 16@AllArgsConstructor 17public class Type { 18 @Id 19 @GeneratedValue(strategy = GenerationType.IDENTITY) 20 private Integer id; 21 22 private String name; 23}
java
1// MainController.java 2package com.example.multitableswitching; 3 4import org.springframework.beans.factory.annotation.Autowired; 5import org.springframework.data.domain.Page; 6import org.springframework.data.domain.Pageable; 7import org.springframework.data.domain.Sort.Direction; 8import org.springframework.data.web.PageableDefault; 9import org.springframework.web.bind.annotation.GetMapping; 10import org.springframework.web.bind.annotation.RequestMapping; 11import org.springframework.web.bind.annotation.RequestParam; 12import org.springframework.web.bind.annotation.RestController; 13 14@RestController 15@RequestMapping(path = "/multi-table") 16public class MainController { 17 @Autowired 18 AlphaSetRepository repo; 19 20 @GetMapping("/all") 21 public Page<AlphaSet> getAll(@RequestParam(value = "table", required = true) final String table, 22 @PageableDefault(page = 0, size = 10, direction = Direction.ASC, sort = { "id" }) final Pageable pageable) { 23 return repo.findAll(pageable); 24 } 25}
java
1// MultiTableSwittingApplication.java 2package com.example.multitableswitching; 3 4import org.springframework.boot.SpringApplication; 5import org.springframework.boot.autoconfigure.SpringBootApplication; 6 7@SpringBootApplication 8public class MultiTableSwittingApplication { 9 10 public static void main(String[] args) { 11 SpringApplication.run(MultiTableSwittingApplication.class, args); 12 } 13 14}
※BravoSet
およびBravoAttribute
は省略していますがAlphaSet
, AlphaAttribute
と内容的に同じ物です。
試したこと
上記の通り、スーパークラスを定義しようとしましたが、うまくいきませんでした。
また、データベースを動的に切り替える方法を解説した記事をいくつか参照したのですが、テーブルを切り替える内容を見つけることができませんでした。
補足情報(FW/ツールのバージョンなど)
- Java
11.0.8 - Spring Boot
2.3.3
お忙しいところ、貴重なお時間をいただき感謝いたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/26 09:52
2020/08/27 00:08