春季启动+ Hibernate + Jboss 6.4

时间:2020-06-30 21:26:10

标签: spring-boot hibernate spring-data-jpa

我在JBoss 6.4中部署的WAR中有一个Spring boot应用程序(1.5.9)。 我想使用自定义命名策略,但是属性(和注释)被完全忽略。我的应用入门:

@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);
    }
}

我的自定义命名类:

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);
    }
    
}

在我的application.properties中,我已经找到了所有可能的属性:

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

像@Table(name =“ ...”)和CustomPhysicalNamingStrategy这样的实体注释将被忽略,没有任何错误。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

所以,基本上,这个问题比我想象的要简单得多,我将自动为面对相同问题的每个人回答我的问题,也许它可以帮上忙。

对我的JBoss安装进行深入分析,我在系统范围的属性文件中发现了这一点:

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

因此spring正在使用全局文件中的属性,而不是application.properties中的属性。

我不知道这是否是正确的行为(我的逻辑告诉我),无论如何,我仅通过删除全局属性定义就解决了该问题。