Я создал базу данных, в которой есть ссылки с таблицей 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
или создать ссылки между таблицами в этом случае?
Hibernate жалуется, что не может отобразить StatusEntity.status
потому что он объявлен типом Object
.
Вы можете изменить его на тип String
который Hibernate должен отображать в базе данных типа ENUM.
Вы также можете использовать перечисление Java для поля status
и отобразить его в @Enumerated
с @Enumerated
аннотации @Enumerated
.
code
иstatus
StatusEntity
на типString
и посмотрите, работает ли он.status
на String, и все работает. Спасибо