Расширение / изменение сгенерированных объектов в Hibernate - PullRequest
0 голосов
/ 05 июля 2018

Я создаю REST API-сервис для базы данных MySQL. Я генерировал классы, используя инструмент персистентности IntelliJ. Это делает довольно хорошую работу.

В схеме, с которой я работаю, есть некоторые причуды. Пользователи хотят, чтобы конечные точки были доступны другому свойству, кроме столбца первичного ключа "id".

Пример: /object/<name property>' versus / object / `.

Здесь есть подвох. Схема может измениться. Свойство name никуда не денется, поэтому можно смело предположить, что оно всегда будет на объекте.

Я узнал, что вы можете использовать суперклассы, чтобы эти сгенерированные объекты имели настраиваемые свойства, не влияя на схему базы данных. Я не хочу вносить изменения в модель в сгенерированном объекте и обновлять макет таблицы базы данных, поскольку это не моя база данных.

У меня есть класс под названием Animal.

    @Entity
    @Table(name = "animals", schema = "xyz123", catalog = "")
    public class AnimalEntity extends AnimalSuperclass {
        private Integer id;
        private String name;
        private String description;

        @Id
        @Column(name = "id", nullable = false)
        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        @Basic
        @Column(name = "name", nullable = true, length = 80)
        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Basic
        @Column(name = "description", nullable = true, length = 255)
        public String getDescription() {
            return description;
        }

        public void setDescription(String description) {
            this.description = description;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            RoleEntity that = (RoleEntity) o;
            return Objects.equals(id, that.id) &&
                    Objects.equals(name, that.name) &&
                    Objects.equals(description, that.description);
        }

        @Override
        public int hashCode() {

            return Objects.hash(id, name, description);
        }
    }

Я должен вручную добавить extends AnimalSuperclass. Что сейчас хорошо. В конце концов я собираюсь попытаться сгенерировать их, используя .xmls во время выполнения.

Тогда у меня есть этот суперкласс ..

    @MappedSuperclass
    public class AnimalSuperclass implements Serializable  {
        private String testMessage;
        private String name;
        private Integer id;

        @Transient
        public String getTestMessage() {
            return this.testMessage;
        }

        public void setTestMessage(String id) {
            this.testMessage = testMessage;
        }
    }

Что я хочу сделать, так это заставить аннотацию @Id находиться в свойстве name внутри суперкласса. Что-то вроде этого.. @MappedSuperclass открытый класс AnimalSuperclass реализует Serializable { private String testMessage; личное строковое имя; закрытый целочисленный идентификатор;

        @Transient
        public String getTestMessage() {
            return this.testMessage;
        }

        public void setTestMessage(String id) {
            this.testMessage = testMessage;
        }

        @Basic
        @Id
        @Column(name = "name", nullable = false, length = 15)
        private String getName() {
            return name;
        }

        private void setName(String name) {
            this.name = name;
        }


        @NaturalId
        @Column(name = "id", nullable = false)
        private Integer getId() {
            return id;
        }

        private void setId(Integer id) {
            this.id = id;
        }
    }

Как мне это сделать? В настоящее время выдается ошибка при достижении конечной точки: {"cause":null,"message":"Id must be assignable to Serializable!: null"}

Ява не мой родной язык, поэтому я ни в коем случае не эксперт. Но из того, что я прочитал, невозможно переопределить свойства подкласса из суперкласса. Есть ли лучший способ приблизиться к этому, может быть, используя RepositoryRestConfiguration? Я использую PagingAndSortingRepository для обслуживания этих организаций. Я не могу расширить сущности и использовать свой суперкласс в качестве дочернего, так как это создает свойство dType в схеме, и я не могу изменить макет таблицы.

1 Ответ

0 голосов
/ 05 июля 2018

Нет жесткой связи между запросом и вашей сущностью. В вашем репозитории вы можете написать методы, которые могут запрашивать данные, полученные из запроса.

Например, если они запрашивают имя, вы можете сделать что-то вроде

Page<AnimalEntity> findByName(String name, Pageable pageable);

в вашем репозитории. Spring позаботится обо всем остальном, а затем вы можете позвонить в свой контроллер.

@Service
public class AnimalService {
  @Autowired
  private AnimalEntityRepository animalRepo;


  public Page<AnimalEntity> findAnimal(String name) {

    Page<AnimalEntity> animals = animalRepo.findByName(name, new PageRequest(1,20));

    return animals;
  }
}

Следует отметить, что в зависимости от того, как вы сконфигурировали Hibernate при отправке сущности обратно клиенту и ее выделению, вы можете получить ошибку инициализации при неудачной ленивости. Если это так, ваши сущности должны быть преобразованы в POJO (обычный старый объект Java), и он будет отправлен обратно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...