如果实体中有List,如何设计数据库模型并使用JpaRepository的保存方法来保存实体<Items>?



JAVA SPRING :I正在探索 JPA,不确定设计数据库的优化方法,并使用存储库的 save(( 立即将实体数据保存到数据库中。具体来说,我有一个基本的类,即。电影-

package com.kurshit.moviesmgr.vo;
import java.util.List;
public class Movie {
    long movieId;
    String title;
    String yearOfRelease;
    List<String> genere;
    public Movie(long movieId, String title, String yearOfRelease, List<String> genere) {
        super();
        this.movieId = movieId;
        this.title = title;
        this.yearOfRelease = yearOfRelease;
        this.genere = genere;
    }
    public Movie() {
        // TODO Auto-generated constructor stub
    }
    public long getMovieId() {
        return movieId;
    }
    public void setMovieId(long movieId) {
        this.movieId = movieId;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getYearOfRelease() {
        return yearOfRelease;
    }
    public void setYearOfRelease(String yearOfRelease) {
        this.yearOfRelease = yearOfRelease;
    }
    public List<String> getGenere() {
        return genere;
    }
    public void setGenere(List<String> genere) {
        this.genere = genere;
    }
}

每部电影都有 Genere - 列表 - 它属于,如 - 动作、喜剧等。

我正在尝试创建一个扩展JpaRepository的接口,并使用内置的保存方法将电影数据保存到数据库中。

不确定我应该如何设计我的数据库 - 如,像这样的问题 - 1.我应该为电影和Genene创建两个不同的表,其中电影表引用Genere吗?2.我应该只创建onw表并将所有Genere的列表作为单个CSV存储在一列中吗?3. 我可以立即使用存储库的 save(( 保存这些数据并将其映射到相应的表中吗?

如果有人可以共享任何源代码或示例代码以供参考或可以提供任何帮助,将不胜感激。

多谢!

首先,您应该搜索查找@Entity注释,以便您可以告诉您的ORM为该实体创建必要的表。其次,您需要问问自己,此应用程序将如何工作。在我看来,最好也创建一个类型实体,通过@ManyToMany关系与电影联系起来。尝试在此处查看简单的实体示例https://spring.io/guides/gs/accessing-data-jpa/

第一个变体 - 使用"流派"作为枚举(如果您的流派是固定列表(:

@Data // it's Lombok annotation: https://projectlombok.org/features/Data
@NoArgsConstructor
@Entity
public class Movie implements Serializable {
    @Id @GeneratedValue 
    private Integer id;
    private String title;
    private Integer yearOfRelease;       
    @ElementCollection
    @Enumerated(EnumType.STRING)
    @Column(name = "genre")
    private List<Genre> genres;
    public Movie(String title, Integer yearOfRelease, List<Genre> genres) {
        this.title = title;
        this.yearOfRelease = yearOfRelease;
        this.genres = genres;
    }
}
public enum Genre {
    ACTION, COMEDY, ...;
}
public interface MovieRepo extends JpaRepository<Movie, Integer> {
}

在这种情况下,您可以像这样创建电影:

Movie movie = new Movie("Title", 2000, Arrays.asList(ACTION, COMEDY));
movieRepo.save(movie);

第二个变体 - "流派"作为独立实体:

@Data
@NoArgsConstructor
@Entity
public class Movie implements Serializable {
    // the same as previous one...
    @ManyToMany
    private List<Genre> genres;
}
@Data
@NoArgsConstructor 
@Entity
public class Genre implements Serializable {
    @Id private String name;
    public Genre(String name) {
        this.name = name
    }
}
public interface MovieRepo extends JpaRepository<Movie, Integer> {
}
public interface GenreRepo extends JpaRepository<Genre, String> {
}

在这种情况下,您首先创建流派:

List<Genre> genres = genreRepo.saveAll(Arrays.asList(
   new Genre("Action"),
   new Genre("Comedy"),
));

然后创建电影:

Movie movie = new Movie("Title", 2000, genres);
movieRepo.save(movie);

更多信息阅读: Hibernate ORM 用户指南 - 集合

最新更新