#java #hibernate #java-14 #javax.persistence
Вопрос:
Я пытаюсь создать класс сущностей с помощью записи Java, но получаю сообщение об ошибке «У сущности нет первичного ключа», хотя я назначил аннотацию идентификатора.
import javax.persistence.*;
import java.time.LocalDate;
@Entity
public record Agent (
@Id
String code,
String name,
LocalDate date,
String workingArea,
String country,
String phoneNumber,
boolean licenseToKill,
int credits,
byte[] picture)
{}
Что в этом плохого?
Комментарии:
1. Насколько я знаю, JPA не поддерживает записи (подробнее о том, почему, см. Эту статью ).
Ответ №1:
A record
нельзя использовать в качестве объекта гибернации, поскольку он нарушает требования объекта в соответствии со спецификацией JPA. Сделайте это class
и @Immutable
вместо этого используйте аннотацию:
@Entity
@Immutable
public class Agent
Ответ №2:
Просто очистите ответ для полноты (хотя @Turning 85 и @gkatiforis уже предоставили правильное объяснение):
В соответствии со спецификацией JPA организация должна следовать этим требованиям:
- класс сущности должен быть не окончательным,
- класс сущностей должен иметь конструктор без аргументов, который является либо общедоступным, либо защищенным,
- атрибуты сущности должны быть не окончательными.
Однако, как объясняется в этой статье, тип записи Java определяется следующим образом:
- связанный класс Java является окончательным,
- существует только один конструктор, который принимает все атрибуты,
- атрибуты записи Java являются окончательными.
Но записи хорошо подходят для проекции DTO, которая часто используется в качестве представления данных, хранящихся в вашей базе данных, только для чтения. дополнительная информация — https://thorben-janssen.com/java-records-hibernate-jpa/
Комментарии:
1. Запись может иметь более одного конструктора.