Question Hibernate @MapKeyColumn et héritage de table provoquant une exception de type de colonne inconnue


Je passe d'Hibernate 4.2.5.Final à 4.3.6.Final, les librairies d'hibernation 4.3.6 provoquent une exception de type mysql unknown colonne. Les classes suivantes ont été simplifiées car je ne peux pas afficher le code de production de mon entreprise dans son intégralité.

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

Où BasicType est juste une énumération

public enum BasicType {
    TYPE1, TYPE2, TYPE3, TYPE4, TYPE5;
}

Et la configuration de base est la suivante:

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

J'ai un test qui tente de persister un objet de zone à une base de données mysql qui génère l'erreur suivante:

**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

Le code d'hibernation généré montre qu'il tente d'insérer la valeur de type dans la table basic_configuration et non dans la table 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

Cette erreur semble avoir été introduite dans la version 4.2.9 d'Hibernate. Après, les versions inférieures à 4.2.9.Final ne semblent pas avoir ce problème, quelqu'un sait comment je peux résoudre ce problème? Merci beaucoup.


11
2017-07-24 22:02


origine


Réponses:


Je me souviens d'avoir eu un problème similaire. Vérifiez ici dans votre code:

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

DANS CETTE LIGNE ->

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

Vous utilisez un mot réservé SQL, "like". Consultez cette liste:

Mots réservés


0
2018-04-05 20:39