【问题标题】:Spring Data JPA Many to Many Service Repository ProblemSpring Data JPA 多对多服务存储库问题
【发布时间】:2019-07-30 23:01:11
【问题描述】:

我正在尝试将 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 来仔细研究这个问题。

ActorRepository

public interface ActorRepository extends JpaRepository<Actor, Integer> {

    Set<Actor> findByActorName(String actorName);
}

ActorService

@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 项目。

【问题讨论】:

    标签: java spring-mvc jpa


    【解决方案1】:

    您正在调用movie.getActor().getActorName(),它基本上对Set&lt;Actor&gt; 对象执行getActorName()

    您基本上将关系视为ManyToOne 而不是OneToMany

    您可以使用以下命令获取Set 的第一个Actor

    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())
    );
    

    【讨论】:

    • 这真的很有道理,但我仍然给我错误。 /home/fatih/Desktop/spring-boot-product-system/src/main/java/com/fatih/movie/service/MovieService.java:[41,56] incompatible types: java.util.Set&lt;com.fatih.movie.model.Actor&gt; cannot be converted to com.fatih.movie.model.Actor [ERROR] /home/fatih/Desktop/spring-boot-product-system/src/main/java/com/fatih/movie/service/MovieService.java:[42,24] incompatible types: com.fatih.movie.model.Actor cannot be converted to java.util.Set&lt;com.fatih.movie.model.Actor&gt;
    • 把你的代码贴在MovieService,基本上你也只需要适应它就行了
    猜你喜欢
    • 2015-05-10
    • 2015-04-07
    • 2020-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 1970-01-01
    相关资源
    最近更新 更多