Hibernate不允许我使用实体类名来表名

时间:2014-08-27 12:07:12

标签: java hibernate

我有一个名为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

这是记录在案的行为吗?对我来说看起来像个错误。

类似的问题:Hibernate ignores @Table(name = "...") for extended classes - created tablenames are all lower case(它指的是继承映射)。

2 个答案:

答案 0 :(得分:3)

在文档中查看。

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 :(得分:1)

对我来说,Hibernate不遵守@Table(name="...")注释中指定的内容似乎很奇怪,所以我挖出了这个错误报告,截至目前已有9年了:

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

这个小虫被拒绝了,上帝和加文金知道为什么(或者它现在只是上帝)。这与JPA 1/2规范相矛盾。最终的答案是:它只是Hibernate开箱即用的方式;如果您保留注释名称亲爱的(或JPA合规性),您应该实施自己的命名策略来修复这个怪癖。