java 如何使用Hibernate v6.2构建NamingStrategy,以将所有列的表名作为前缀?

thtygnil  于 2023-10-14  发布在  Java
关注(0)|答案(1)|浏览(124)

我想让数据库中所有的基本列和主键都以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中的表名?

ewm0tg9j

ewm0tg9j1#

Hibernate 6.2.x中,使用AnnotatedColumn类中存在的getExplicitTableName()进行尝试。
将代码更新为:

String tableName = column.getExplicitTableName().toLowerCase();

相关问题