【问题标题】:Spring boot + Hibernate + Jboss 6.4春季启动+休眠+ Jboss 6.4
【发布时间】:2020-10-21 06:50:43
【问题描述】:

我在 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 等实体注释会被忽略,不会出现任何错误。

有什么想法吗?

【问题讨论】:

  • 您是自己配置EntityManagerFactory 还是使用自动配置? spring.jpa.properties.hibernate.physical_naming_strategy 应该是您的 Spring Boot 版本的正确选项。 (其他人不是)。如果您可以升级到 2.x 版本,那么您只需将您的策略​​定义为一个 bean 就更容易了,它将被使用。我也想知道你是否也应该指定`ImplicitNamingStrategy`。
  • 不,我没有配置实体管理器,由于 JBoss 版本,我无法升级到 2.x。

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


【解决方案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 中的属性。

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

【讨论】:

    猜你喜欢
    • 2015-06-30
    • 2020-05-17
    • 1970-01-01
    • 2018-04-25
    • 1970-01-01
    • 2018-01-23
    • 1970-01-01
    • 2016-03-24
    • 2013-01-11
    相关资源
    最近更新 更多