2016-11-30 58 views
3

我试图将基于注解的配置转换为基于XMl。请不要问我为什么要这样做。原则上这成了。Spring Data JPA:Annotaton based works fine,but XML based not

Java类:

package org.cloudjumper.configs; 

import org.hibernate.jpa.HibernatePersistenceProvider; 
import org.springframework.context.annotation.*; 
import org.springframework.core.env.Environment; 
import org.springframework.data.jpa.repository.config.EnableJpaRepositories; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.jpa.JpaTransactionManager; 
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 

import javax.annotation.Resource; 
import javax.sql.DataSource; 
import java.util.Properties; 

@Configuration 
@EnableTransactionManagement 
@ComponentScan("org.cloudjumper") 
@PropertySource("classpath:app.properties") 
@EnableJpaRepositories("org.cloudjumper.db.repositories.") 
public class DataConfig { 

    private static final String PROP_DATABASE_DRIVER = "db.driver"; 
    private static final String PROP_DATABASE_PASSWORD = "db.password"; 
    private static final String PROP_DATABASE_URL = "db.url"; 
    private static final String PROP_DATABASE_USERNAME = "db.username"; 
    private static final String PROP_HIBERNATE_DIALECT = "db.hibernate.dialect"; 
    private static final String PROP_HIBERNATE_SHOW_SQL = "db.hibernate.show_sql"; 
    private static final String PROP_ENTITYMANAGER_PACKAGES_TO_SCAN = "db.entitymanager.packages.to.scan"; 
    private static final String PROP_HIBERNATE_HBM2DDL_AUTO = "db.hibernate.hbm2ddl.auto"; 

    @Resource 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 

     dataSource.setDriverClassName(env.getRequiredProperty(PROP_DATABASE_DRIVER)); 
     dataSource.setUrl(env.getRequiredProperty(PROP_DATABASE_URL)); 
     dataSource.setUsername(env.getRequiredProperty(PROP_DATABASE_USERNAME)); 
     dataSource.setPassword(env.getRequiredProperty(PROP_DATABASE_PASSWORD)); 

     return dataSource; 
    } 

    @Bean 
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() { 
     LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 
     entityManagerFactoryBean.setDataSource(dataSource()); 
     entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class); 
     entityManagerFactoryBean.setPackagesToScan(env.getRequiredProperty(PROP_ENTITYMANAGER_PACKAGES_TO_SCAN)); 

     entityManagerFactoryBean.setJpaProperties(getHibernateProperties()); 

     return entityManagerFactoryBean; 
    } 

    @Bean 
    public JpaTransactionManager transactionManager() { 
     JpaTransactionManager transactionManager = new JpaTransactionManager(); 
     transactionManager.setEntityManagerFactory(entityManagerFactory().getObject()); 

     return transactionManager; 
    } 

    private Properties getHibernateProperties() { 
     Properties properties = new Properties(); 
     properties.put(PROP_HIBERNATE_DIALECT, env.getRequiredProperty(PROP_HIBERNATE_DIALECT)); 
     properties.put(PROP_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROP_HIBERNATE_SHOW_SQL)); 
     properties.put(PROP_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROP_HIBERNATE_HBM2DDL_AUTO)); 

     return properties; 
    } 

} 

和XML的部分是:

<context:annotation-config/> 
    <context:component-scan base-package="org.cloudjumper"/> 

    <bean class="org.cloudjumper.configs.DataConfig"/> 

    <jpa:repositories base-package="org.cloudjumper.db.repositories" 
         entity-manager-factory-ref="entityManagerFactory" 
         transaction-manager-ref="transactionManager"/> 
    <tx:annotation-driven transaction-manager="transactionManager" /> 

    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource" id="dataSource"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <property name="url" value="jdbc:mysql://localhost:3306/void"/> 
     <property name="username" value="***"/> 
     <property name="password" value="***"/> 
    </bean> 

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="persistenceProviderClass" value="org.hibernate.jpa.HibernatePersistenceProvider"/> 
     <property name="packagesToScan" value="org.cloudjumper.db.tables"/> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="db.hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="db.hibernate.show_sql">true</prop> 
       <prop key="db.hibernate.hbm2ddl.auto">create</prop> 
      </props> 
     </property> 
    </bean> 

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

所以注释工作正常,但XML配置返回错误:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'usersRepository': Invocation of init method failed; nested exception is org.hibernate.resource.transaction.backend.jta.internal.JtaPlatformInaccessibleException: Unable to access TransactionManager or UserTransaction to make physical transaction delegate 

UserRepository的详细资料:

package org.cloudjumper.db.repositories; 

import org.cloudjumper.db.tables.Users; 
import org.springframework.data.repository.CrudRepository; 

/** 
* Created by cloudjumper on 11/30/16. 
*/ 
public interface UsersRepository extends CrudRepository<Users, Integer> { 
    Users findByLogin(String login); 
    Users findByName(String name); 
} 

他们看起来完全相同。我放弃了1小时前的尝试,任何人都可以帮助我?

+0

我还没有测试过......将''添加到'“。 –

+0

你在应用程序中使用了'persistence.xml'吗?如果是,该文件中的“事务类型”是否设置为“JTA”?如果是的话,那是你得到的例外的来源。你的配置有一个'JpaTransactionManager',它是一个非JTA事务管理器,而JPA上下文则要求它符合JTA。此外,最好在'LocalContainerEntityManagerFactoryBean'上使用'jpaVendorAdapter'而不是'persistenceProviderClass'来设置JPA提供程序。 – manish

+0

你的建议没有帮助我。这真是难过;这真是伤心。 – Cloudjumper

回答

0

关键值jpaProperties是错误的,您应该删除前缀“db。”。

<property name="jpaProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.hbm2ddl.auto">create</prop> 
     </props> 
    </property>