我想让数据库中所有的基本列和主键都以tableName为前缀,因此具有属性“name”和“age”的“Person”变为
CREATE TABLE person ( person_id, person_name text, person_age int)
这很好,因为我可以很容易地在PostgreSQL中使用“自然连接”。
这是目前我的NamingStrategy,它在hibernate6.1.7(Sping Boot 3.0.5附带)中运行良好。
import org.hibernate.boot.model.naming.*;
import org.hibernate.cfg.AnnotatedColumn;
import java.lang.reflect.Field;
public class HibernateImplicitNamingStrategy extends
ImplicitNamingStrategyComponentPathImpl {
@Override
public Identifier determineJoinColumnName(ImplicitJoinColumnNameSource source) {
String name = source.getReferencedColumnName().toString().toLowerCase();
return toIdentifier(name, source.getBuildingContext());
}
@Override
public Identifier determinePrimaryTableName(ImplicitEntityNameSource source) {
return super.determinePrimaryTableName(source);
}
@Override
public Identifier determineBasicColumnName(ImplicitBasicColumnNameSource source) {
try {
Field field = source.getClass().getDeclaredField("this$0");
field.setAccessible(true);
AnnotatedColumn column = (AnnotatedColumn) field.get(source);
// explicit naming oder implicit
String tableName = column.getTable().getName().toLowerCase();
final Identifier basicColumnName = super.determineBasicColumnName(source);
String columnName = tableName + "_" + basicColumnName.toString().toLowerCase();
return Identifier.toIdentifier(columnName);
} catch (Exception e) {
return super.determineBasicColumnName(source);
}
}
}
当我移动到hibernate6.2.x时,它不再工作(Sping Boot 3.1.x附带的)。类AnnotatedColumn已更改(并已移动到另一个包)。我这样修改了import:
//import org.hibernate.cfg.AnnotatedColumn;
import org.hibernate.boot.model.internal.AnnotatedColumn;
但是新的AnnotatedColumn
没有方法getTable()
。我想我必须转向更常见的命名策略,因为它看起来很危险。但这不是现在的问题。
我想知道,是否有一种方法可以访问determineBasicColumnName中的表名?
1条答案
按热度按时间ewm0tg9j1#
在Hibernate 6.2.x中,使用
AnnotatedColumn
类中存在的getExplicitTableName()
进行尝试。将代码更新为: