【问题标题】:org.hibernate.MappingException: property mapping has wrong number of columns in ENUM entityorg.hibernate.MappingException:属性映射在 ENUM 实体中有错误的列数
【发布时间】:2019-04-11 07:31:03
【问题描述】:

我创建了一个数据库,它有一个 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”的 bean 创建错误 资源 [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 类型:> 对象

我想,我确实犯了错误

  • 在创建表explorer,在字符串中:

      FOREIGN KEY (status_id) REFERENCES status(code)
    
  • 或在创建类EntityStatus

这种情况下如何正确创建Status实体或创建表间引用?

【问题讨论】:

  • StatusEntitycodestatus字段改成String类型,看看是否有效。
  • @tsolakp 我刚刚将status 类型更改为字符串,一切正常。谢谢
  • @tsolakp 如果你回答,我会接受它

标签: java mysql hibernate


【解决方案1】:

Hibernate 抱怨它无法映射 StatusEntity.status,因为它被声明为 Object 类型。

您可以将其更改为 String 类型,Hibernate 应该能够映射到数据库 ENUM 类型。

您还可以将 Java 枚举用于 status 字段,并使用 @Enumerated 注释让休眠映射它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 2014-06-20
    • 1970-01-01
    相关资源
    最近更新 更多