繁体   English   中英

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

[英]Hibernate @MapKeyColumn and table inheritance causing Unknown column type exception

我正在从hibernate 4.2.5.Final升级到4.3.6.Final,4.3.6 hibernate libs导致mysql未知列类型异常。 以下课程已经简化,因为我无法完整地展示我公司的生产代码。

@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;
    }

BasicType只是一个枚举

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;
    }
}

我有一个测试,试图将区域对象持久化到mysql数据库,产生以下错误:

**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代码显示它正在尝试将类型值插入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以下的版本似乎没有这个问题,任何人都知道如何解决这个问题? 非常感谢。

我记得有类似的问题。 在您的代码中查看:

@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保留字,“喜欢”。 检查此列表:

保留字

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM