具有可配置后缀的SpringPhysicalNamingStrategy

时间:2019-04-02 07:40:19

标签: java spring spring-boot orm

我们想完成一个双重运行的设置,其中我们的应用程序在表中写入数据,该表的名称由JPA配置的表名称和任意后缀组成。

我们的应用程序使用带有Hibernate支持的Spring ORM的Spring Boot。

后缀应该易于配置,最好是通过Spring Boot的外部化配置。

以下是我们的SpringPhysicalNamingStrategy实现,该实现将后缀追加到表名。该后缀目前已进行硬编码。

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
import org.springframework.stereotype.Component;

import java.util.HashSet;
import java.util.Set;

import static java.util.Arrays.asList;

@Component
public class DoubleRunPhysicalNamingStrategy extends SpringPhysicalNamingStrategy implements PhysicalNamingStrategy {

    private Set<String> tableNames = new HashSet<>(asList("AR", "AP"));

    private String suffix = "_2";

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment) {
        Identifier identifier =
                super.toPhysicalTableName(name, jdbcEnvironment);

        if (tableNames.contains(identifier.getText().toUpperCase())) {
            return new Identifier(String.format("%s%s", identifier.getText(), suffix), identifier.isQuoted());
        }

        return identifier;
    }

}

最后,上述物理命名策略是通过以下应用程序属性配置的:     spring.jpa.hibernate.naming.physical-strategy = DoubleRunPhysicalNamingStrategy

我们尝试使用@Value和通过@Autowired的另一个组件来使后缀可配置,但是没有运气。两者均未接线,并且未分配。

有关如何实现此目标的任何建议?

0 个答案:

没有答案