我有一个名为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(它指的是继承映射)。
答案 0 :(得分: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) );
}
}
更多链接参考。
答案 1 :(得分:1)
对我来说,Hibernate不遵守@Table(name="...")
注释中指定的内容似乎很奇怪,所以我挖出了这个错误报告,截至目前已有9年了:
NamingStrategy should not be used when table or column name is supplied
这个小虫被拒绝了,上帝和加文金知道为什么(或者它现在只是上帝)。这与JPA 1/2规范相矛盾。最终的答案是:它只是Hibernate开箱即用的方式;如果您保留注释名称亲爱的(或JPA合规性),您应该实施自己的命名策略来修复这个怪癖。