JPA проблема: проблема с сохранением класса ассоциации, который имеет составной ключ EmbeddedId - PullRequest
0 голосов
/ 04 мая 2020

Я довольно новичок в изучении JPA и хочу получить представление о следующем: у меня возникают проблемы с сохранением строк класса ассоциации в соответствующей таблице с использованием JPA.

Класс ассоциации 'movie_showings «1-ко-многим с« кино »на одной стороне и« 1-ко-многим »с« театрами »на другой стороне. Как вы можете себе представить, существует составной первичный ключ, состоящий из внешних ключей из последних двух классов. Я решил реализовать это с помощью класса Embeddable 'movie_showings_pk'.

На этом этапе создание объекта класса ассоциации, передача ему mov ie и театра для создания PK не является проблемой. Вызов функций для связи экземпляра movie_showing с театрами и фильмами соответственно не является проблемой. Тем не менее, когда я go, чтобы PERSIST экземпляр 'movie_showings' в базе данных, используя entityManager, я получаю исключение нарушения ограничения, которое я не совсем понимаю:

Исключение в потоке "main" javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.7.1.v20171221-bd47e8f): org.eclipse.persistence.exceptions.DatabaseException Внутреннее исключение: java. sql .SQLIntegrityConstraintViol MOVIES_MID 'не может принять значение NULL. Код ошибки: 20000 Вызов: INSERT INTO movie_showings (DATEOFLASTSHOW, OPENINGDATE, MOV IE, THEATRE, MOVIE_MID, THEATER_TID) VALUES (?,?,?,?,?,?) Bind => [6 параметров привязаны] Запрос: InsertObjectQuery (PK => MOV IE ID> 3 THEATER ID> 1 Дата открытия: январь-15-2020)

Вот определение функции, которое я использую для проверки этого:

   private void loadInitialMovieShowings ()
   {
      System.out.println ("LOADING movie_showings...");

      List <Movie> allMovies = entityManager.createNamedQuery(Movie.FIND_ALL, Movie.class).getResultList();
      List <Theater> allTheaters = entityManager.createNamedQuery(Theater.FIND_ALL, Theater.class).getResultList();

      Theater spectrum = null;
      for (Theater theater : allTheaters)
         if (theater.getName().contains("Irvine Spectrum"))
            spectrum = new Theater (theater);

      List <Movie> allStarWars = new ArrayList<>();

      for (Movie movie : allMovies)
         if (movie.getTitle().contains("Star Wars"))
            allStarWars.add(movie);

      for (Movie movie : allStarWars)
      {
         MovieShowing temp = new MovieShowing (movie, spectrum,
                 new GregorianCalendar(2020, 00, 15),
                 new GregorianCalendar(2020, 04, 04));

         movie.addMovieShowing(temp);
         spectrum.addMovieShowing(temp);

         entityManager.persist (temp);
      }
   }

Это (часть) класса ассоциации:

public class MovieShowing 
{
    // QUERY STRING(S)
    public static final String FIND_ALL_ID = "MovieShowing.FIND_ALL_ID";
    public static final String FIND_ALL_INFO = "MovieShowing.FIND_ALL_INFO";

    @EmbeddedId
    private Movie_Showings_PK ms_id;

    @Temporal (TemporalType.DATE)
    private GregorianCalendar openingDate;

    @Temporal (TemporalType.DATE)
    private GregorianCalendar dateOfLastShow;

    // ASSOCIATION(S)
    @ManyToOne
    private Theater theater;

    @ManyToOne 
    private Movie movie;

    // CONSTRUCTORS
    public MovieShowing () { }
    public MovieShowing (Movie movie, Theater theater, GregorianCalendar opening, GregorianCalendar closing)
    {
        ms_id = new Movie_Showings_PK(movie, theater);

        setMovie(movie);
        setTheater(theater);
        setOpeningDate(opening);
        setDateOfLastShow(closing);
    }

    ...

Это класс Embeddedable:

public class Movie_Showings_PK
{
    @Basic
    private Long theater;

    @Basic
    private Long movie;

    // CONSTRUCTORS
    public Movie_Showings_PK () {}
    public Movie_Showings_PK (Movie movie, Theater theater)
    {
        this.movie = movie.getMID ();
        this.theater = theater.getTID ();
    }
    ...

Я уверен, что ответ правильный у меня на лице, но Я пару дней чесал голову, пытаясь понять ... Спасибо за понимание, все!

1 Ответ

0 голосов
/ 05 мая 2020

AH. Я был идиотом. В моем классе 'Mov ie' я ошибочно поместил отдельную ассоциацию @ManyToMany с 'Theater' в предыдущей попытке связать эти две таблицы. После удаления все отлично заработало. Пиши это до растущих болей ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...