Проблема с хранилищем данных в JPA Многие ко многим - PullRequest
0 голосов
/ 09 марта 2019

Я пытаюсь добавить объект 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 для реализации ManyToMany.

1 Ответ

0 голосов
/ 09 марта 2019

Вы вызываете movie.getActor().getActorName(), который в основном делает getActorName() на Set<Actor> объекте.

Вы в основном рассматриваете отношение как ManyToOne вместо OneToMany

Вы можете использовать следующее для извлечения первых 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())
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...