2014-08-27 55 views
5

我有一個名爲LocationType實體(BaseEntity@MappedSuperclass):Hibernate不會讓我使用的實體類名錶名

@Entity 
public class LocationType extends BaseEntity 

這個實體產生的表名是location_type。我明白默認的命名策略是這樣的。

我不明白的是爲什麼我不能強制Hibernate使用文字名稱,locationtype。無論我做什麼:

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

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

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

表名總是作爲location_type結束。 Hibernate只是知道更好!

如果我使用任何其他名稱

@Entity(name = "wtf") 

然後表的名稱變成wtf爲好。

這是記錄的行爲?對我來說看起來像一個bug。

相似問題:Hibernate ignores @Table(name = "...") for extended classes - created tablenames are all lower case(它指的是繼承映射,雖然)。

+0

你使用的是什麼版本的hibernate?你是否也使用hibernate註釋或javax.persistence註釋? – Vinc 2014-08-27 12:12:33

+0

我沒有看到任何問題,如果我使用'javax.persistence.Entity',你可以發佈一些更多的細節,如hibernate.cfg.xml文件中的任何特定屬性和你的超類等等,以瞭解問題。 – Chaitanya 2014-08-27 12:41:10

+0

@Entity和@Table都來自「javax.persistence」。休眠版本是4.3.1。 – MaDa 2014-08-27 13:00:42

回答

1

這似乎很奇怪,我認爲Hibernate不服從什麼在@Table(name="...") annnotation指定的,所以我挖出了這個bug報告,9歲截至目前:

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

這個錯誤被拒絕了,上帝和加文金知道爲什麼(或者現在只是上帝)。這與JPA 1/2規範相矛盾。最終的答案就是:這就是Hibernate如何開箱即用;如果您持有註釋名稱dear(或JPA合規性),則應該實現自己的命名策略來解決這個問題。

2

看看這裏的文檔。

ImprovedNamingStrategy

Implementing a NamingStrategy

這是org.hibernate.cfg.ImprovedNamingStrategy的行爲,它將混合大小寫名稱轉換爲嵌入的下劃線名稱。 http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/cfg/ImprovedNamingStrategy.html。因此,如果您明確使用名稱「EventLog」,它將轉換爲「event_log」。

如果您只是想使用@Table中明確指定的名稱,則應該使用org.hibernate.cfg.DefaultNamingStrategy。默認情況下,它在您實例化您的對象時使用org.hibernate.cfg.Configuration對象

如果您想要對除明確指定名稱的所有表使用ImprovedNamingStrategy,可以使用下面的子類。 columnName和tableName方法是在明確指定名稱時調用的方法,該子類不受干擾地保留指定的名稱。

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

更多要引用的鏈接。

link1

link2

+1

問題中所描述的與註釋中給出的明確名稱不可能覆蓋命名策略有什麼關係? – MaDa 2014-08-28 07:19:28

+0

@MaDa回答編輯了一些解決方案 – 2014-08-28 07:50:50

相關問題