java - 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 项目。
解决方案
您正在调用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())
);
推荐阅读
- amazon-web-services - 将 Amazon EC2 t2.small 预留实例应用于 t3.small
- python - 如何让多处理稍等一下?
- javascript - Plotly 模式栏运行在两行而不是一行
- merge - 如何将 Diffuse 设置为 Mercurial 的 3 向合并工具并从中间窗格保存到目标
- node.js - 如何在第一次 X 时间内跳过 pm2 应用程序在崩溃时重新启动
- python - 如何在折线图中绘制带有日期时间列的数据框?
- kubernetes - 如何为 kafka 和 Kubernetes 进行端口映射:如何正确设置广播的侦听器?
- php - 单击主页按钮时,url 显示完整路径,而不仅仅是 index.php
- ruby-on-rails - Ruby on Rails - 如何在不删除整个购物车项目的情况下删除购物车中的单个 ProductItem
- python - Pandas 列在组内排序,忽略其他列