2014-07-24 14 views
10

Aktualizuję ze stanu hibernacji 4.2.5.Final do wersji 4.3.6.Final, biblioteki hibernacji 4.3.6 powodują wyjątek typu kolumny nieznany mysql. Poniższe klasy zostały uproszczone, ponieważ nie jestem w stanie w całości pokazać kodu produkcji mojej firmy.Hibernate @MapKeyColumn i dziedziczenie tabeli powodujące nieznany typ kolumny wyjątek

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

Gdzie BasicType jest po prostu enum

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

i podstawowa konfiguracja jest:

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

mam test, który stara się utrzymywać przedmiot kierunkowy do db mysql który produkuje następujący błąd:

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

Wygenerowany kod hibernacji pokazuje, że próbuje wstawić wartość typu do tabeli basic_configuration a nie tabeli 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 

Błąd ten zdaje się zostały wprowadzone w wersji hibernacji 4.2.9.Final r wersje Poniżej 4.2.9. Wygląda na to, że nie ma tego problemu. Czy ktoś wie, jak mogę to rozwiązać? Wielkie dzięki.

+0

Czy jesteś pewien, że nazwa kolumny jest „typ”, a nie „area_type”? –

+0

To jest stare pytanie, ale nie jestem pewien, czy dyskryminator jest kolumną dostępną do użycia w konfiguracji MapKeyColumn. Jest wykorzystywany za kulisami przez Hibernate do zarządzania domeną polimorficzną w tabeli, więc nie jest tak naprawdę "częścią" zarządzanego obiektu. – Daedalus

Odpowiedz

0

Pamiętam, że miałem podobny problem. Sprawdź tutaj w kodzie:

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

w tej linii ->

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

Używasz SQL Reserved słowo "jak". Sprawdzić tę listę:

Reserved words

Powiązane problemy