hibernate改进的命名策略覆盖实体中的表名
我使用的是org.hibernate.cfg.ImprovedNamingStrategy,但是对于一个表,我已经明确指定了表名hibernate改进的命名策略覆盖实体中的表名,hibernate,Hibernate,我使用的是org.hibernate.cfg.ImprovedNamingStrategy,但是对于一个表,我已经明确指定了表名 @Table(name="EventLog",schema = "eventlogs") 但是hibernate似乎在寻找事件日志。显式命名不应该覆盖由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对象时使用它如果要对所有表(明确指定名称的表除外)使用改进的命名策略,可以使用下面的子类。columnName和tableName方法是显式指定名称时调用的方法,该子类使指定的名称不受影响
我觉得奇怪的是,这不是默认行为
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的使用仍然应该识别带注释的名称。见下面我的答案。