Hibernate不允许我使用实体类名称作为表名

4

我有一个名为LocationType的实体( BaseEntity是一个@MappedSuperclass):

@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 忽略扩展类的 @Table(name = "...") - 创建的表名都是小写(虽然它涉及继承映射)。


你使用的是哪个版本的Hibernate?另外,你是使用Hibernate注解还是javax.persistence注解? - Vinc
如果我使用javax.persistence.Entity,我并没有看到任何问题,你能否发布一些更多的细节,例如hibernate.cfg.xml文件中的任何特定属性和您的超类等,以更好地理解这个问题。 - Chaitanya
@Entity和@Table都来自于“javax.persistence”。Hibernate版本为4.3.1。 - MaDa
2个回答

3

请在文档中查看。

改进的命名策略

实现命名策略

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

2

我觉得奇怪的是Hibernate不遵守@Table(name="...")注释中指定的内容,所以我找到了这个9年历史的错误报告:

当表格或列名已被提供时,不应使用NamingStrategy

这个错误被拒绝了,上帝和Gavin King知道为什么(或者现在只有上帝知道)。这与JPA 1/2规范相矛盾。因此,最终答案是:这就是Hibernate开箱即用的工作方式;如果您重视您的注释名称(或JPA兼容性),则应该实现自己的命名策略来修复这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接