2014-08-27 14 views
5

Ho un'entità denominata LocationType (BaseEntity è una @MappedSuperclass):Hibernate non mi permette di utilizzare entità nome della classe per il nome della tabella

@Entity 
public class LocationType extends BaseEntity 

Il nome della tabella generata per questa entità è location_type. Capisco che la strategia di denominazione predefinita funzioni in questo modo.

Quello che non riesco a capire è il motivo per cui non posso forzare Hibernate ad usare il nome letterale, locationtype. Non importa quello che faccio:

@Entity(name = "LocationType") 
public class LocationType 

o

@Entity 
@Table(name = "LocationType") 
public class LocationType 

o

@Entity(name = "LocationType") 
@Table(name = "LocationType") 
public class LocationType 

il nome della tabella sempre finisce come location_type. Hibernate semplicemente sa meglio!

Se uso un altro nome

@Entity(name = "wtf") 

poi il nome della tabella diventa wtf pure.

È questo comportamento documentato? Sembra un insetto per me.

domanda simile: Hibernate ignores @Table(name = "...") for extended classes - created tablenames are all lower case (si riferisce alla mappatura ereditaria, però).

+0

Quale versione di ibernazione stai usando? Inoltre stai usando annotazioni di ibernazione o annotazioni javax.persistence? – Vinc

+0

Non vedo alcun problema se uso 'javax.persistence.Entity', puoi pubblicare ulteriori dettagli come qualsiasi proprietà specifica nel file hibernate.cfg.xml e la tua super classe ecc per capire il problema beter. – Chaitanya

+0

Sia @Entity sia @Table provengono da '' javax.persistence''. La versione di ibernazione è 4.3.1. – MaDa

risposta

1

Mi sembrava strano che Hibernate non obbedisce a quanto specificato nel @Table(name="...") annnotation, così ho scavato questo bug report, 9 anni a partire da ora:

NamingStrategy should not be used when table or column name is supplied

L'errore è stato rifiutato, Dio e Gavin King sanno perché (o forse è solo Dio ora). Questo contraddice le specifiche JPA 1/2. La risposta finale è così: è proprio come Hibernate funziona fuori dalla scatola; se si mantengono i nomi delle annotazioni cari (o la conformità JPA), è necessario implementare la propria strategia di denominazione per risolvere questo problema.

2

dai uno sguardo qui in documenti.

ImprovedNamingStrategy

Implementing a NamingStrategy.

È il comportamento di org.hibernate.cfg.ImprovedNamingStrategy, che converte i nomi di maiuscole e minuscole nel nome di caratteri di sottolineatura incorporati. http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/cfg/ImprovedNamingStrategy.html. Quindi se usi esplicitamente il nome "EventLog", si convertirà in "event_log".

Se si desidera semplicemente utilizzare il nome esplicitamente specificato nello @Table, è necessario utilizzare org.hibernate.cfg.DefaultNamingStrategy. Per impostazione predefinita viene utilizzato quando si crea un'istanza dell'oggetto org.hibernate.cfg.Configuration

Se si desidera utilizzare lo ImprovedNamingStrategy per tutte le tabelle tranne quelle che specificano esplicitamente un nome, è possibile utilizzare la sottoclasse seguente. I metodi columnName e tableName sono quelli chiamati quando un nome è specificato esplicitamente, questa sottoclasse lascia i nomi specificati non molestati.

public class RespectfulImprovedNamingStrategy extends ImprovedNamingStrategy 
{ 
    @Override 
    public String columnName(String columnName) 
    { 
     return columnName; 
    } 

    @Override 
    public String tableName(String tableName) 
    { 
     return tableName; 
    } 

    @Override 
    public String classToTableName(String className) { 
    return addUnderscores(StringHelper.unqualify(className)); 
    } 
} 

più collegamenti a cui fare riferimento.

link1

link2

+1

In che modo è correlato all'impossibilità di scavalcare la strategia di denominazione con un nome esplicito dato nell'annotazione, come descritto nella domanda? – MaDa

+0

@MaDa risposta modificata con qualche soluzione –

Problemi correlati