Javax-Постоянство : Сущность не имеет первичного ключа, использующего записи Java

#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. Запись может иметь более одного конструктора.