hibernate改进的命名策略覆盖实体中的表名

hibernate改进的命名策略覆盖实体中的表名,hibernate,Hibernate,我使用的是org.hibernate.cfg.ImprovedNamingStrategy,但是对于一个表,我已经明确指定了表名 @Table(name="EventLog",schema = "eventlogs") 但是hibernate似乎在寻找事件日志。显式命名不应该覆盖由ImprovedNamingStrategy提供的命名吗?这是org.hibernate.cfg.ImprovedNamingStrategy的行为,它将混合大小写名称转换为嵌入的下划线名称。因此,如果显式使用名称“

我使用的是org.hibernate.cfg.ImprovedNamingStrategy,但是对于一个表,我已经明确指定了表名

@Table(name="EventLog",schema = "eventlogs")

但是hibernate似乎在寻找事件日志。显式命名不应该覆盖由ImprovedNamingStrategy提供的命名吗?

这是org.hibernate.cfg.ImprovedNamingStrategy的行为,它将混合大小写名称转换为嵌入的下划线名称。因此,如果显式使用名称“EventLog”,它将转换为“event_log”


如果您只是想使用
@表中明确指定的名称,则应使用org.hibernate.cfg.DefaultNamingStrategy。默认情况下,在实例化org.hibernate.cfg.Configuration对象时使用它

如果要对所有表(明确指定名称的表除外)使用改进的命名策略,可以使用下面的子类。columnNametableName方法是显式指定名称时调用的方法,该子类使指定的名称不受影响

我觉得奇怪的是,这不是默认行为

public class RespectfulImprovedNamingStrategy extends ImprovedNamingStrategy
{
    @Override
    public String columnName(String columnName)
    {
        return columnName;
    }

    @Override
    public String tableName(String tableName)
    {
        return tableName;
    }
}

您可以明确建议hibernate使用旧的EJB3NamingStrategy,该策略通过定义以下属性(取决于是否使用SpringV4+)来识别带注释的表名:

春天:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
无弹簧(仅休眠):


为冬眠4与春天

  spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
   spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
为了冬眠和春天

  spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy
   spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

注释应该优先于命名策略。你在用还是?也许试试另一张?你打算怎么申请一张桌子?与内置的DefaultNamingStrategy有何不同?当在
@Table
注释中未指定“name”参数时,DefaultNamingStrategy假设表名是非限定类名;i、 e.为类x.x.AccountStatus生成的表名为“AccountStatus”。如果在
@Table
属性中指定名称参数,则它将使用任何名称参数。由ImprovedNamingStrategy生成的表名使用下划线而不是驼峰大小写,即“account_status”ImprovedNamingStrategy忽略了
@table
注释中的“name”参数,我的建议只是在name参数存在时尊重它。据我所知,您不能/不会将其仅应用于一个表。命名策略适用于会话。你救了我一天!搜索了很多地方,但从未解释过这个概念。我认为Hibernate4+更改了DefaultNamingStrategy,以便它现在也忽略带注释的表名。配置EJB3NamingStrategy的使用仍然应该识别带注释的名称。见下面我的答案。