如何使用 XML 配置 Spring Data JPA

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25049778/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 12:04:23  来源:igfitidea点击:

How to configure Spring Data JPA using XML

xmlconfigurationspring-dataspring-data-jpa

提问by Navid

I'm reading the book "Professional Java for Web Applications - Nicholas S. Williams" The book example has this configuration for Spring Data JPA:

我正在阅读“Web 应用程序的专业 Java - Nicholas S. Williams”一书,该书示例对 Spring Data JPA 具有以下配置:

@Bean
public DataSource customerSupportDataSource()
{
    JndiDataSourceLookup lookup = new JndiDataSourceLookup();
    return lookup.getDataSource("jdbc/CustomerSupport");
}

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean()
{
    Map<String, Object> properties = new Hashtable<>();
    properties.put("javax.persistence.schema-generation.database.action",
            "none");
    properties.put("hibernate.ejb.use_class_enhancer", "true");

    HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
    adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5InnoDBDialect");

    LocalContainerEntityManagerFactoryBean factory =
            new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(adapter);
    factory.setDataSource(this.customerSupportDataSource());
    factory.setPackagesToScan("com.wrox.site.entities",
            "com.wrox.site.converters");
    factory.setSharedCacheMode(SharedCacheMode.ENABLE_SELECTIVE);
    factory.setValidationMode(ValidationMode.NONE);
    factory.setLoadTimeWeaver(this.loadTimeWeaver); // TODO: remove when SPR-10856 fixed
    factory.setJpaPropertyMap(properties);
    return factory;
}

@Bean
public PlatformTransactionManager jpaTransactionManager()
{
    return new JpaTransactionManager(
            this.entityManagerFactoryBean().getObject()
    );
}

But I have been configuring using XML, I cannot figure out how to translate this to XML only, I have this so far

但是我一直在使用 XML 进行配置,我无法弄清楚如何仅将其转换为 XML,到目前为止我已经有了

<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/test"/>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="myEmf" />
</bean>

<bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="myDataSource" />
    <property name="packagesToScan" value="com.test" />
</bean>

Can any one guide me how to convert this?

任何人都可以指导我如何转换它?

Thanks

谢谢

回答by pkainulainen

If you want to configure Spring Data JPA by using XML configuration (and use the configuration described in the book), you have to follow these steps:

如果要使用 XML 配置来配置 Spring Data JPA(并使用书中描述的配置),则必须按照以下步骤操作:

  1. Configure the data source bean.
  2. Configure the entity manager factory bean.
  3. Configure the transaction manager bean.
  4. Enable annotation driven transaction management.
  5. Configure Spring Spring Data JPA.
  1. 配置数据源 bean。
  2. 配置实体管理器工厂 bean。
  3. 配置事务管理器 bean。
  4. 启用注释驱动的事务管理。
  5. 配置 Spring Spring Data JPA。

The application context configuration (applicationContext-persistence.xml) file looks as follows:

应用程序上下文配置 ( applicationContext-persistence.xml) 文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa 
    http://www.springframework.org/schema/data/jpa/spring-jpa-1.0.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.1.xsd">

  <!-- Configure the data source bean -->
  <jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/CustomerSupport"/>

  <!-- Create default configuration for Hibernate -->
  <bean id="hibernateJpaVendorAdapter" 
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>

  <!-- Configure the entity manager factory bean -->
  <bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
    <!-- Set JPA properties -->
    <property name="jpaProperties">
      <props>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
        <prop key="javax.persistence.schema-generation.database.action">none</prop>
        <prop key="hibernate.ejb.use_class_enhancer">true</prop>
      </props>
    </property>
    <!-- Set base package of your entities -->
    <property name="packagesToScan" value="foo.bar.model"/>
    <!-- Set share cache mode -->
    <property name="sharedCacheMode" value="ENABLE_SELECTIVE"/>
    <!-- Set validation mode -->
    <property name="validationMode" value="NONE"/>
  </bean>

  <!-- Configure the transaction manager bean -->
  <bean id="transactionManager" 
    class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
  </bean>

  <!-- Enable annotation driven transaction management -->
  <tx:annotation-driven/>

  <!-- 
    Configure Spring Data JPA and set the base package of the 
    repository interfaces 
  -->
  <jpa:repositories base-package="foo.bar.repository"/>
</beans>

回答by Babu Selvam

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.thought.service.*" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="true" />
            <property name="showSql" value="false" />
            <property name="database" value="MYSQL" />
        </bean>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
        </props>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>

<bean id="transactionSupport" class="com.thought.service.common.database.TransactionSupport" />

<bean id="transactionTemplate" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
    <property name="proxyInterfaces">
        <list>
            <value>com.thought.service.common.database.TransactionTemplate</value>
        </list>
    </property>
    <!-- <property name="proxyTargetClass" value="false" />   -->
    <property name="transactionManager" ref="transactionManager" />
    <property name="target" ref="transactionSupport" />

    <property name="transactionAttributes">
        <props>
            <prop key="save">PROPAGATION_REQUIRES_NEW,-java.lang.Exception</prop>
        </props>
    </property>
</bean>

public class TransactionSupport implements TransactionTemplate {

公共类 TransactionSupport 实现 TransactionTemplate {

public void save(PersistenceHandler persistanceHandler, ModelTemplate model) throws Exception {
    persistanceHandler.save(model);
}

}

}

public interface TransactionTemplate {

公共接口 TransactionTemplate {

public void save(PersistenceHandler persistanceHandler, ModelTemplate model) throws Exception;

}

}

public abstract class PersistenceHandler {

公共抽象类 PersistenceHandler {

/**
 * Method to implement the actual transaction controlled database operations
 * @param model {@code ModelTemplate}
 * 
 * @throws Exception
 */
public abstract void save(ModelTemplate model) throws Exception;

}

}