当前位置: 首页 > 知识库问答 >
问题:

Spring Boot Hibernate自动配置与手动注释配置

归翔
2023-03-14

我有一个Spring Boot Web应用程序,它尝试使用Hibernate访问我的数据库。我还有一个不同的、没有spring boot应用程序,它尝试访问相同的数据库。

我正在使用一个带注释的类配置无Spring Boot应用程序

由于某些原因,Spring Boots自动配置的作用与注释类配置不同。

如果第一次连接到数据库并使用hibernate ddl创建模式,然后使用另一种配置方式重新连接,则会出现ddl错误,例如枚举列将停止工作。

spring.datasource.url=jdbc:hsqldb:file:databaseFiles/hibData/;hsqldb.write_delay_millis=0
spring.datasource.root=sa
spring.datasource.password=1
spring.datasource.driverClassName=org.hsqldb.jdbcDriver


spring.jpa.properties.hibernate.current_session_context_class=org.springframework.orm.hibernate5.SpringSessionContext
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.HSQLDialect
spring.jpa.properties.hibernate.show_sql=true
spring.jpa.properties.hibernate.hbm2ddl.auto=update
spring.jpa.properties.hibernate.jdbc.batch_size=50
spring.jpa.properties.hibernate.order_inserts=true
spring.jpa.properties.hibernate.order_updates=true
spring.jpa.properties.hibernate.jdbc.batch_versioned_data=true

配置类:

import org.apache.commons.dbcp.BasicDataSource;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;


@Configuration
@EnableTransactionManagement
public class DatabaseHibConfig {

    @Bean
    public DataSource getDataSource(){
            BasicDataSource ds = new BasicDataSource();
            ds.setDriverClassName("org.hsqldb.jdbcDriver");
            ds.setUrl("jdbc:hsqldb:file:databaseFiles/hibData/;hsqldb.write_delay_millis=0");
            ds.setUsername("sa");
            ds.setPassword("1");
            return ds;
    }

    @Bean
    public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory, DataSource dataSource){
        JpaTransactionManager jpaTransactionManager = new JpaTransactionManager();
        jpaTransactionManager.setDataSource(dataSource);
        jpaTransactionManager.setEntityManagerFactory(entityManagerFactory);
        return jpaTransactionManager;
    }

    @Bean
    LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
        entityManagerFactoryBean.setDataSource(dataSource);
        entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
        entityManagerFactoryBean.setPackagesToScan("mediabeast.data.hibernate.model");

        Properties jpaProperties = new Properties();

        jpaProperties.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");

        jpaProperties.put("hibernate.hbm2ddl.auto","update");

        jpaProperties.put("hibernate.show_sql","true");

        entityManagerFactoryBean.setJpaProperties(jpaProperties);

        return entityManagerFactoryBean;
    }
}

共有1个答案

颜乐
2023-03-14

将以下属性添加到这两个配置似乎可以修复导致代码停止工作的错误。

spring.jpa.properties.hibernate.physical_naming_strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
spring.jpa.properties.hibernate.implicit_naming_strategy=org.hibernate.boot.model.naming.ImplicitNamingStrategyJpaCompliantImpl

然而,当切换配置时,我仍然会在启动时收到“对象已经存在”的ddl错误。

 类似资料:
  • 当我使用Spring framework时,我经常看到2个术语基于Java和基于注释的配置/自动生成。 如果它们不一样,你能告诉我它们之间有什么不同吗?

  • 问题内容: 在最近我从事的一些大型项目中,选择其中一种(XML或注释)似乎变得越来越重要。随着项目的发展,一致性对于可维护性非常重要。 我的问题是:与基于注释的配置相比,基于XML的配置有哪些优势?与基于XML的配置相比,基于注释的配置有哪些优势? 问题答案: 注释有其用途,但它们不是杀死XML配置的灵丹妙药。我建议将两者混合! 例如,如果使用Spring,则将XML用于应用程序的依赖注入部分是完

  • 问题内容: 我正在看工作区中的一些旧示例。由于没有 @Autowired, 我看不到自动 装配的方式 。Spring Boot + Facebook默认配置。 它工作完美,但是这些bean如何在没有@Autowired的情况下自动进行自动连线? 它们是作为字段或在构造函数中自动接线的吗? 问题答案: 借助Spring Boot 1.4+,构造函数将自动进行自动接线 https://docs.spr

  • 我的Spring Boot应用程序JPA配置有一个问题。我有两个配置文件-dev(H2 db)和prod(PostgreSQL)。我想在没有Spring Boot“Magic”的情况下手动设置JPA,所以我创建了如下所示的配置类 我发现这可能是的问题,因为当我在PersistenceContext类中通过属性映射设置该属性时,它可以正常工作。我不知道如何通过属性文件正确设置它。事先谢谢你的帮助。

  • 16. 自动配置 Spring Boot的自动配置机制尝试根据所添加的jar依赖来自动配置您的Spring程序。例如,如果HSQLDB在您的类路径上,而且您尚未手动配置任何数据库连接bean,那么我们会自动配置一个内存数据库。 您需要通过将@EnableAutoConfiguration或@SpringBootApplication注解添加到一个@Configuration类来激活自动配置。 应当

  • Spring Boot自动配置尝试根据您添加的jar依赖项自动配置Spring应用程序。 例如,如果HSQLDB在您的类路径上,并且您尚未手动配置任何数据库连接bean,则Spring Boot会自动配置内存数据库。 您需要通过将@EnableAutoConfiguration或@SpringBootApplication注解添加到其中一个@Configuration类来选择自动配置。 您应该只添