hibernate ImprovedNamingStrategy覆盖实体中的表名

时间:2011-02-19 11:31:09

标签: hibernate

我正在使用org.hibernate.cfg.ImprovedNamingStrategy,但对于一个表我明确指定了表名

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

但是hibernate似乎在寻找event_log。显式命名不应该覆盖ImprovedNamingStrategy

提供的命名

4 个答案:

答案 0 :(得分:10)

如果您想对所有表使用ImprovedNamingStrategy,除了那些明确指定名称的表,您可以使用下面的子类。 columnName tableName 方法是在显式指定名称时调用的方法,此子类使指定的名称不受限制。

我认为这不是默认行为,这很奇怪。

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

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

答案 1 :(得分:5)

这是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对象

时使用它

答案 2 :(得分:2)

你可以明确地建议hibernate使用旧的EJB3NamingStrategy,它通过定义以下属性来识别带注释的表名(取决于使用spring V4 +):

弹簧:

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

没有弹簧(只有休眠):

hibernate.ejb.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

答案 3 :(得分:2)

用于春天的hibernate 4

  spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

用于带有spring的hibernate5

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