为什么hibernate版本5.2.17生成的HQL具有'_id';附加所有具有关联的列

为什么hibernate版本5.2.17生成的HQL具有'_id';附加所有具有关联的列,hibernate,hql,Hibernate,Hql,我试图将hibernate从4.3迁移到5.2。我面临的问题是,版本5.2.17生成的HQL将“_id”附加到所有具有关联的列中 public class Person { private Long id; @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY) private Customer customer; private String othercolumns; } public

我试图将hibernate从4.3迁移到5.2。我面临的问题是,版本5.2.17生成的HQL将“_id”附加到所有具有关联的列中

public class Person {

    private Long id;

    @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private Customer customer;

    private String othercolumns;
}

public class Customer {

    private Long id;

    @OneToMany(cascade = CascadeType.ALL, mappedBy = "customer", fetch = FetchType.LAZY)
    private Set<Person> persons = new HashSet<Person>();

    private String othercolumns;
}
在上面生成的HQL中,为什么客户列附加了_id?因此,我的查询没有返回任何内容。同时,在将customer\u id更改为customer之后,我尝试启动这个查询,结果成功了

我已经实施了如下的物理命名策略

public class ImprovedNamingStrategy implements PhysicalNamingStrategy {

    @Override
    public Identifier toPhysicalCatalogName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier identifier, JdbcEnvironment jdbcEnv) {n
        return convert(identifier);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier identifier, JdbcEnvironment jdbcEnv) {
        return convert(identifier);
    }

    private Identifier convert(Identifier identifier) {
        if (identifier == null || StringUtils.isBlank(identifier.getText())) {
            return identifier;
        }

        String regex = "([a-z])([A-Z])";
        String replacement = "$1_$2";
        String newName = identifier.getText().replaceAll(regex, replacement).toLowerCase();
        return Identifier.toIdentifier(newName);
    }
}

任何帮助都将不胜感激。

这是由于Hibernate采用的命名策略。因此,表中对象的引用是外键。Hibernate假定此外键名为:
reference\u name
+
\u id

已解析!!当没有提供隐式命名策略时,这是hibernate的默认行为。 我刚才补充说

<property name="hibernate.implicit_naming_strategy" value="org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl"/>


在我的persistence.xml中,它成功了

明白了。谢谢@JBNizet
<property name="hibernate.implicit_naming_strategy" value="org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl"/>