moretti.fabio
moretti.fabio

Reputation: 1138

Spring boot + Hibernate + Jboss 6.4

I have a Spring boot app (1.5.9) in a WAR deployed in JBoss 6.4. I want to use a custom naming strategy, but properties (and annotations) are completely ignored. My app starter:

@SpringBootApplication
@ComponentScan
public class CedulasApiApplication extends SpringBootServletInitializer {
    
    private static final String DATASOURCE_JNDI_NAME = "java:/ONLINE";

    public static void main(String[] args) {
        SpringApplication.run(CedulasApiApplication.class, args);
    }
    
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(CedulasApiApplication.class);
    }   

    @Bean
    public DataSource dataSource() {
        final JndiDataSourceLookup dsLookup = new JndiDataSourceLookup();
        dsLookup.setResourceRef(true);
        return dsLookup.getDataSource(DATASOURCE_JNDI_NAME);
    }
}

my custom naming class:

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {

    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    private Identifier capitalize(Identifier name) {
        if (name == null)
            return null;
        if (name.isQuoted())
            return name;
        String text = name.getText().toUpperCase();
        return Identifier.toIdentifier(text);
    }
    
}

and in my application.properties I've put ALL the possible properties I've found:

spring.jpa.hibernate.naming.physical-strategy=com.app.CustomPhysicalNamingStrategy
spring.jpa.properties.hibernate.physical_naming_strategy=com.app.database.CustomPhysicalNamingStrategy
org.springframework.boot.orm.jpa.SpringNamingStrategy=com.app.database.CustomPhysicalNamingStrategy
hibernate.physical_naming_strategy=com.app.database.CustomPhysicalNamingStrategy

Entity annotations like @Table(name="...") and CustomPhysicalNamingStrategy are simply ignored, with no error whatsoever.

Any Idea?

Upvotes: 3

Views: 200

Answers (1)

moretti.fabio
moretti.fabio

Reputation: 1138

So, basically the problem was much more trivial than I suspected, I'll auto answer my question for everyone who is facing the same problem, maybe it can help.

Doing a deep analysis of my JBoss installation I've discovered this in a system-wide properties file:

spring.jpa.hibernate.naming.implicit-strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyHbmImpl
spring.jpa.hibernate.naming.physical-strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy

So spring are using properties from global file instead those from application.properties.

I don't understand if it is the correct behaviour (my logic tell me not), anyway I've resolved the issue simply by deleting global properties definitions.

Upvotes: 1

Related Questions