Код: Выделить всё
film_idЛогическая связь такова, что Film сущность знает о соответствующей сущности Text, но Text не содержит ссылку на Film. Вот структура моих таблиц:
DDL для фильма:
Код: Выделить всё
CREATE TABLE `film` (
`film_id` smallint unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(128) NOT NULL,
`description` text,
`release_year` year DEFAULT NULL,
`language_id` tinyint unsigned NOT NULL,
`original_language_id` tinyint unsigned DEFAULT NULL,
`rental_duration` tinyint unsigned NOT NULL DEFAULT '3',
`rental_rate` decimal(4,2) NOT NULL DEFAULT '4.99',
`length` smallint unsigned DEFAULT NULL,
`replacement_cost` decimal(5,2) NOT NULL DEFAULT '19.99',
`rating` enum('G','PG','PG-13','R','NC-17') DEFAULT 'G',
`special_features` set('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`film_id`),
KEY `idx_fk_language_id` (`language_id`),
KEY `idx_fk_original_language_id` (`original_language_id`),
CONSTRAINT `fk_film_language` FOREIGN KEY (`language_id`) REFERENCES `language` (`language_id`) ON DELETE RESTRICT ON UPDATE CASCADE,
CONSTRAINT `fk_film_language_original` FOREIGN KEY (`original_language_id`) REFERENCES `language` (`language_id`) ON DELETE RESTRICT ON UPDATE CASCADE
) ENGINE=InnoDB;
Код: Выделить всё
CREATE TABLE `film_text` (
`film_id` smallint NOT NULL,
`title` varchar(255) NOT NULL,
`description` text,
PRIMARY KEY (`film_id`),
FULLTEXT KEY `idx_title_description` (`title`, `description`)
) ENGINE=InnoDB;
Код: Выделить всё
FilmКод: Выделить всё
@Entity
@Table(schema = "movie", name = "film")
@Getter
@Setter
@NoArgsConstructor
@RequiredArgsConstructor
public class Film {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "film_id")
private Integer id;
@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@MapsId
@JoinColumn(name = "film_id", nullable = false)
@NonNull
private Text text;
// other fields and relationships
}
Код: Выделить всё
TextКод: Выделить всё
@Entity
@Table(schema = "movie", name = "film_text")
@Getter
@Setter
@NoArgsConstructor
@RequiredArgsConstructor
public class Text {
@Id
@Column(name = "film_id")
@Setter(AccessLevel.NONE)
private Integer id;
@Column(nullable = false)
@NonNull
private String title;
@Column(length = 65_535)
private String description;
}
Код: Выделить всё
Identifier of entity 'Text' must be manually assigned before calling 'persist()'
org.hibernate.id.IdentifierGenerationException: Identifier of entity 'Text' must be manually assigned before calling 'persist()'
Я ожидаю, что когда я сохраняю объект Film, Hibernate должен сгенерировать идентификатор для фильма
Ожидаемое поведение:
Я ожидаю, что когда я сохраняю объект Film, Hibernate должен сгенерировать идентификатор фильма
code> и автоматически назначать этот идентификатор связанному объекту Text (поскольку они используют один и тот же первичный ключ).
Что я пробовал:
- Я настроил @MapsId в объекте Film, который должен сопоставить первичный ключ Film с текстом .
- Я убедился, что каскадирование настроено правильно с помощью CascadeType.ALL.
- Я использовал @JoinColumn чтобы обеспечить правильное сопоставление между столбцами Film_id в обоих объектах.
Почему Hibernate не присваивает автоматически Film_id из Film в Text во время операции persist() и как я могу устранить это исключение IdentifierGenerationException? Есть ли что-то, чего мне не хватает в сопоставлении объектов, что позволило бы правильно распределять идентификатор между двумя объектами?
Будем очень признательны за любые идеи или предложения!
Подробнее здесь: https://stackoverflow.com/questions/790 ... ith-shared
Мобильная версия