当前位置: 首页 > 知识库问答 >
问题:

Hibernate@MapKeyColumn和表继承导致未知列类型异常

公孙涵育
2023-03-14
@Entity
@Table(name = "area")
public class Area {
    private Integer id;
    private Map<BasicType, BasicConfiguration> configurationsMap =
        new HashMap<BasicType, BasicConfiguration>();

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

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

    @OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.ALL}, orphanRemoval = true)
    @JoinTable(name = "area_configuration", joinColumns = {@JoinColumn(name = "area_id")},
               inverseJoinColumns = {@JoinColumn(name = "basic_configuration_id")})
    @MapKeyEnumerated(EnumType.STRING)
    @MapKeyColumn(name = "type")
    public Map<BasicType, BasicConfiguration> getConfigurationsMap () {
        return configurationsMap;
    }
public enum BasicType {
    TYPE1, TYPE2, TYPE3, TYPE4, TYPE5;
}
@Entity
@Table(name = "basic_configuration")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class BasicConfiguration {

    private Integer id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }
}
**Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Unknown column 'type' in 'field list'**
    at sun.reflect.GeneratedConstructorAccessor73.newInstance(Unknown Source)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)

    at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:408)
    at com.mysql.jd

生成的hibernate代码显示它正在尝试将type值插入basic_configuration表而不是area_configuration表:

**Hibernate: insert into basic_configuration (entity_version, type) values (?, TYPE1)**
Tests run: 9, Failures: 0, Errors: 9, Skipped: 0, Time elapsed: 0.208 sec <<< FAILURE! - 
javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1316)
at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:881)
at sun.reflect.Ge

这个错误似乎是在hibernate版本4.2.9.Final以后引入的,低于4.2.9.Final的版本似乎没有这个问题,有人知道我如何解决这个问题吗?多谢。

共有1个答案

狄令
2023-03-14

我记得有过类似的问题。请在代码中检查以下内容:

@Entity
@Table(name = "basic_configuration")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)
public abstract class BasicConfiguration {

    private Integer id;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    public Integer getId() {
        return id;
    }

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

在这一行->

@DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.STRING)

您正在使用一个SQL保留字“like”。检查此列表:

 类似资料:
  • 我在Hibernate中有道传承,下面是代码: 用户DAO: 我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。 用户DAO: 客户道: 销售DAO: 我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出

  • 我有两个实体BillingAddress和ShippingAddress映射到具有鉴别器类型列的表地址。 我能够使用不同的类型值在DB中成功保存/更新两个地址类型。 我面临的问题是当我查询地址表时,如下所示: 这工作正常,但查询ShippingAddress会引发非均匀查询结果异常,即结果中同时包含ShippingAddress和Billingaddress。请让我知道,我应该怎么做。

  • 问题内容: 我想向内置类型添加一些属性,所以我这样写: 但仅包含元素。为什么我在这里不工作?我应该如何从类似内置类型的继承?像这样的不可变类型是否相同? 问题答案: 该类型通常在其方法内进行列表的实际初始化,因为这是可变类型的约定。子类型化不可变类型时,只需要覆盖即可。虽然 可以在对列表进行子分类时覆盖,但对于您的用例而言,这样做没有多大意义。覆盖比较容易: 另请注意,在这种情况下,建议不要使用。

  • 我有来自API的响应文本。当我试图创建一个新的游戏从这个响应我得到一个错误: 错误:未处理的异常:“列表”类型不是“列表”类型的子类型 我在尝试使用JSON文本时遇到如下错误: 错误: 未处理的异常:“列表”类型不是“列表”类型的子类型 它指向游戏类中的这一行: 有什么建议吗?

  • 我有这个目标: 还有这个:

  • 我正在自己学习swift,但我无法让这个代码运行,我正在尝试创建一个类“Inhabitant”,它继承了Person类的一个新的“Country”属性,有两个初始值设定项:-一个接受firstname和lastname,并将Country设置为空String-一个接收firstname,lastname和country,并创建String类型的计算属性描述,该描述返回由空格分隔的名字、姓氏和国家