为什么hibernate版本5.2.17生成的HQL具有'_id';附加所有具有关联的列
我试图将hibernate从4.3迁移到5.2。我面临的问题是,版本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
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"/>