org.hibernate.MappingException: отображение свойств имеет неправильное количество столбцов в объекте ENUM

0

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

пример скриптов:

CREATE TABLE status (
  code VARCHAR(40),
  status ENUM('not started', 'in progress', 'finished')
);

insert into status (code, status)
values (1, 'not started'),
       (2, 'in progress'),
       (3, 'finished');

CREATE TABLE 'explorer' (
  'id' bigint(20) NOT NULL AUTO_INCREMENT,
  'create_date' datetime DEFAULT NULL,
  'query' varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
  'title' varchar(255) COLLATE utf8mb4_unicode_520_ci DEFAULT NULL,
  'status_id' int DEFAULT NULL,
  PRIMARY KEY ('id'),
  FOREIGN KEY (status_id) REFERENCES status(code)
) ENGINE=MyISAM AUTO_INCREMENT=45 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

Итак, после создания таблицы я автоматически создал сущности для этих таблиц:

  • Проводник:

    @Entity
    @Table(name = "explorer", schema = "parsebeandeveloper", catalog = "")
    public class ExplorerEntity {
    private long id;
    private Timestamp createDate;
    private String query;
    private String title;
    private Integer statusId;
    
    @Id
    @Column(name = "id")
    public long getId() {
        return id;
    }
    
    public void setId(long id) {
        this.id = id;
    }
    
    @Basic
    @Column(name = "create_date")
    public Timestamp getCreateDate() {
        return createDate;
    }
    
    public void setCreateDate(Timestamp createDate) {
        this.createDate = createDate;
    }
    
    @Basic
    @Column(name = "query")
    public String getQuery() {
        return query;
    }
    
    public void setQuery(String query) {
        this.query = query;
    }
    
    @Basic
    @Column(name = "title")
    public String getTitle() {
        return title;
    }
    
    public void setTitle(String title) {
        this.title = title;
    }
    
    @Basic
    @Column(name = "status_id")
    public Integer getStatusId() {
        return statusId;
    }
    
    public void setStatusId(Integer statusId) {
        this.statusId = statusId;
    }
    }
    

класс, где я получаю исключение:

  • Статус:

    @Entity
    @Table(name = "status", schema = "parsebeandeveloper")
    public class StatusEntity {
    private Integer code;
    private Object status;
    
    @Basic
    @Column(name = "code")
    public Integer getCode() {
        return code;
    }
    
    public void setCode(Integer code) {
        this.code = code;
    }
    
    @Basic
    @Column(name = "status")
    public Object getStatus() {
        return status;
    }
    
    public void setStatus(Object status) {
        this.status = status;
    }
    

    }

То, что я получаю в консоли:

org.springframework.beans.factory.BeanCreationException:

Ошибка создания компонента с именем entityManagerFactory, определенным в ресурсе пути к классу [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: сбой вызова метода init; вложенным> исключением является javax.persistence.PersistenceException: [PersistenceUnit: default] Невозможно собрать Hibernate SessionFactory; вложенное исключение: org.hibernate.MappingException: отображение свойств имеет неверное количество столбцов: com.sb.bean.parser.explorer.model.domain2.StatusEntity.status тип:> object

Я думаю, что я сделал ошибку

  • в explorer создания таблицы, в строке:

      FOREIGN KEY (status_id) REFERENCES status(code)
    
  • или в создании класса EntityStatus

Как правильно создать сущность Status или создать ссылки между таблицами в этом случае?

  • 1
    Измените поля code и status StatusEntity на тип String и посмотрите, работает ли он.
  • 0
    @tsolakp Я просто изменил тип status на String, и все работает. Спасибо
Показать ещё 1 комментарий
Теги:
hibernate

1 ответ

1
Лучший ответ

Hibernate жалуется, что не может отобразить StatusEntity.status потому что он объявлен типом Object.

Вы можете изменить его на тип String который Hibernate должен отображать в базе данных типа ENUM.

Вы также можете использовать перечисление Java для поля status и отобразить его в @Enumerated с @Enumerated аннотации @Enumerated.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню