【问题标题】:Hibernate won't let me use entity class name for table nameHibernate 不允许我使用实体类名作为表名
【发布时间】:2014-10-21 00:23:21
【问题描述】:

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

表名alwayslocation_type 结尾。 Hibernate 知道得更好!

如果我使用任何其他名称

@Entity(name = "wtf")

那么表名也变成wtf

这是记录在案的行为吗?对我来说似乎是一个错误。

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

【问题讨论】:

  • 你使用的是什么版本的休眠?你还在使用hibernate注解还是javax.persistence注解?
  • 如果我使用javax.persistence.Entity,我看不到任何问题,您能否发布更多详细信息,例如 hibernate.cfg.xml 文件和您的超类等中的任何特定属性,以更好地理解问题。
  • @Entity 和@Table 都来自javax.persistence。休眠版本是 4.3.1。

标签: java hibernate


【解决方案1】:

在此处查看文档。

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

【讨论】:

  • 如问题中所述,它与无法用注释中给出的显式名称覆盖命名策略有什么关系?
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 2021-08-20
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-01-27
    相关资源
    最近更新 更多