Я довольно новичок в изучении 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 ();
}
...
Я уверен, что ответ правильный у меня на лице, но Я пару дней чесал голову, пытаясь понять ... Спасибо за понимание, все!