Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.5k views
in Technique[技术] by (71.8m points)

spring - Table name configured with external properties file

I build a Spring-Boot application that accesses a Database and extracts data from it. Everything is working fine, but I want to configure the table names from an external .properties file.

like:

@Entity
@Table(name = "${fleet.table.name}")
public class Fleet {
...
}

I tried to find something but I didn't.

You can access external properties with the @Value("...") annotation.

So my question is: Is there any way I can configure the table names? Or can I change/intercept the query that is sent by hibernate?

Solution:

Ok, hibernate 5 works with the PhysicalNamingStrategy. So I created my own PhysicalNamingStrategy.

@Configuration 
public class TableNameConfig{

    @Value("${fleet.table.name}")
    private String fleetTableName;

    @Value("${visits.table.name}")
    private String visitsTableName;

    @Value("${route.table.name}")
    private String routeTableName;

    @Bean
    public PhysicalNamingStrategyStandardImpl physicalNamingStrategyStandard(){
        return new PhysicalNamingImpl();
    }

class PhysicalNamingImpl extends PhysicalNamingStrategyStandardImpl {

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        switch (name.getText()) {
            case "Fleet":
                return new Identifier(fleetTableName, name.isQuoted());
            case "Visits":
                return new Identifier(visitsTableName, name.isQuoted());
            case "Result":
                return new Identifier(routeTableName, name.isQuoted());
            default:
                return super.toPhysicalTableName(name, context);
        }
    }
}
}

Also, this Stackoverflow article over NamingStrategy gave me the idea.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Table names are really coming from hibernate itself via its strategy interfaces. Boot configures this as SpringNamingStrategy and there were some changes in Boot 2.x how things can be customised. Worth to read gh-1525 where these changes were made. Configure Hibernate Naming Strategy has some more info.

There were some ideas to add some custom properties to configure SpringNamingStrategy but we went with allowing easier customisation of a whole strategy beans as that allows users to to whatever they need to do.

AFAIK, there's no direct way to do config like you asked but I'd assume that if you create your own strategy you can then auto-wire you own properties to there. As in those customised strategy interfaces you will see the entity name, you could reserve a keyspace in boot's configuration properties to this and match entity names.

mytables.naming.fleet.name=foobar
mytables.naming.othertable.name=xxx

Your configuration properties would take mytables and within that naming would be a Map. Then in your custom strategy it would simply be by checking from mapping table if you defined a custom name.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...