首页 > 解决方案 > Spring Data JPA 多对多服务存储库问题

问题描述

我正在尝试将 ManyToMany 实体添加到我的应用程序中。我创建了实体但无法实现它。

演员等级

@Entity
@Table(name = "actor")
public class Actor {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @Column(nullable = false, name = "actor_name")
    private String actorName;

    @ManyToMany(mappedBy = "actor", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Set<Movie> movie = new HashSet<Movie>();

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getActorName() { return actorName; }

    public void setActorName(String actorName) {
        this.actorName = actorName;
    }

    public Set<Movie> getMovie() {
        return movie;
    }

    public void setMovie(Set<Movie> movie) {
       this.movie = movie;
    }
}

电影课上我有

@ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(
            name = "movie_actor",
            joinColumns = {@JoinColumn(name = "movie_id")},
            inverseJoinColumns = {@JoinColumn(name = "actor_id")}
    )
    Set<Actor> actor = new HashSet<Actor>();

........................

 public Set<Actor> getActor () {
        return actor;
    }

    public void setActor(Set<Actor> actor){
        this.actor = actor;
    }

我像这样创建了我的实体,但是在MovieService中;

Actor actor = ActorRepository.findByActorName(movie.getActor().getActorName());
        movie.setActor(actor);

这部分给了我错误。movie.getActor().getActorName() 方法找不到。我需要看哪里?在 IDE 中,它还说从未使用方法 getActorName 和 setActorName。我还添加了我的 ActorRepository 和 ActorService 来仔细研究这个问题。

演员库

public interface ActorRepository extends JpaRepository<Actor, Integer> {

    Set<Actor> findByActorName(String actorName);
}

演员服务

@Service
public class ActorService {

    private ActorRepository actorRepository;

    @Autowired
    public ActorService(ActorRepository actorRepository) {
        this.actorRepository = actorRepository;
    }

    public List<Actor> getAllActor() {
        return actorRepository.findAll();
    }
}

添加 ManyToMany 后,我使用的是 OneToMany 实体。服务适用于 OneToMany。我如何将它们用于多对多?我需要在我的电影中添加多个演员。我找不到 ManyToMany 实现的 MVC 项目。

标签: javaspring-mvcjpa

解决方案


您正在调用movie.getActor().getActorName()which 基本上getActorName()Set<Actor>对象执行 a 。

您基本上将关系视为 aManyToOne而不是 aOneToMany

您可以使用以下内容来获取第Actor一个Set

ActorRepository.findByActorName(movie.getActors().iterator().next().getActorName());

但是当然,你没有你所有Actor的名字

你可以做的是以下

public interface ActorRepository extends JpaRepository<Actor, Integer> {

    Set<Actor> findByActorNameIn(List<String> actorName);
}

并以这种方式调用它

ActorRepository.findByActorNameIn(
    movie.getActors()
         .stream()
         .map(Actor::getName)
         .collect(Collectors.toList())
);

推荐阅读