如何在 Spring JPA Web 应用程序中设置一些 Hibernate 属性?

问题描述 投票:0回答:3

我正在尝试删除 Spring JPA Web 应用程序中典型的

persistence.xml
文件。到目前为止,我已经成功地通过以下命令注入了
EntityManager

@Configuration
@EnableTransactionManagement
public class JpaConfig {

    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(){

        LocalContainerEntityManagerFactoryBean factoryBean
            = new LocalContainerEntityManagerFactoryBean();

        factoryBean.setDataSource( this.restDataSource() );
        factoryBean.setPackagesToScan( new String[ ] { "com.jverstry" } );
        factoryBean.setPersistenceUnitName("MyMy");

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter(){
         {
            // JPA properties ...
         }
        };

        factoryBean.setJpaVendorAdapter( vendorAdapter );

        return factoryBean;

    }

    @Bean
    public DataSource restDataSource(){

        DriverManagerDataSource dataSource = new DriverManagerDataSource();

        dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
        dataSource.setUrl("jdbc:hsqldb:mem:testdb");
        dataSource.setUsername("sa");
        dataSource.setPassword("");

        return dataSource;

    }

    @Bean
    public PlatformTransactionManager transactionManager(){

        JpaTransactionManager transactionManager = new JpaTransactionManager();

        transactionManager.setEntityManagerFactory(
            this.entityManagerFactoryBean().getObject() );

        return transactionManager;

    }

}

我已成功移动数据源的 persistence.xml 的属性:

<properties>
    ... 
    <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
    <property name="hibernate.hbm2ddl.auto" value="create"/>
</properties>

但是如何设置上面剩下的两个休眠属性?谢谢

java spring hibernate jpa configuration
3个回答
31
投票

Spring 提供了一种使用

AbstractJpaVendorAdapter
setDatabase()
setGenerateDdl()
,尽管
setGenerateDdl()
不采用 DDL 模式)以独立于提供者的方式配置这些选项的方法。

或者,您可以使用

LocalContainerEntityManagerFactory
(或
setJpaProperties()
)将任意属性传递给
setJpaPropertyMap()

Properties props = new Properties();
props.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
props.put("hibernate.hbm2ddl.auto", "create");
factoryBean.setJpaProperties(props);

7
投票

这是一个老问题,但可能会对使用 XML 进行配置的人有所帮助。

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="test-jpa"/>
    <property name="dataSource" ref="dataSourceProxy"/>
    <property name="jpaDialect">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />
    </property>

    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true"/>
            <property name="generateDdl" value="false"/>
            <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
            <property name="database" value="MYSQL"/>
        </bean>
    </property>
    <property name="jpaPropertyMap">
        <map>
            <entry key="hibernate.jdbc.batch_size" value="10"/>
            <entry key="hibernate.jdbc.fetch_size" value="10"/>
            <entry key="hibernate.order_inserts" value="true"/>
            <entry key="hibernate.order_updates" value="true"/>
            <entry key="hibernate.jdbc.batch_versioned_data" value="true"/>
            <entry key="hibernate.format_sql" value="true"/>
        </map>
    </property>
</bean>

0
投票

对于未来的开发者

虽然接受的答案是正确的,但这个问题很久以前就提出了,如果

  1. 您将
    spring-boot
    spring-data-jpa
  2. 一起使用
  3. 并且您没有显式禁用 Hibernate 的自动配置

然后你可以配置 spring 将使用的属性来实例化

LocalContainerEntityManagerFactory
从而配置 Hibernate。这些属性需要添加到
application.yml
文件中:

spring:
  jpa:
    show-sql: true
    properties:
      hibernate:
        format_sql: true
        allow_update_outside_transaction: false

这里,

spring.jpa.hibernate
下的所有属性都是hibernate本身特有的属性(如
allow_update_outside_transaction
),而不是
spring-data-jpa

希望有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.