IdentifierGenerationException при сохранении связи @OneToOne с общим первичным ключомJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 IdentifierGenerationException при сохранении связи @OneToOne с общим первичным ключом

Сообщение Anonymous »

Я работаю с базой данных MySQL и использую Hibernate (6.6.0.Final) без Spring. Моя схема включает в себя две таблицы: Film и Film_text, которые неявно связаны отношением один к одному. Таблица фильма имеет сгенерированный первичный ключ (), и я хочу, чтобы этот ключ использовался совместно с таблицей Film_text в качестве ее первичного ключа.
Логическая связь такова, что 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;
DDL для Film_text:

Код: Выделить всё

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;
В моей модели Hibernate я использую аннотацию @MapsId, чтобы гарантировать, что объект Text повторно использует первичный ключ связанного фильма. Вот код моих объектов: объект:

Код: Выделить всё

@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
}
объект:

Код: Выделить всё

@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;
}
Когда я пытаюсь сохранить объект Film (который должен каскадно сохранять текст), я сталкиваюсь со следующей ошибкой:

Код: Выделить всё

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»