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小時前的嘗試,任何人都可以幫助我?
我還沒有測試過......將' '添加到'「。 –
你在應用程序中使用了'persistence.xml'嗎?如果是,該文件中的「事務類型」是否設置爲「JTA」?如果是的話,那是你得到的例外的來源。你的配置有一個'JpaTransactionManager',它是一個非JTA事務管理器,而JPA上下文則要求它符合JTA。此外,最好在'LocalContainerEntityManagerFactoryBean'上使用'jpaVendorAdapter'而不是'persistenceProviderClass'來設置JPA提供程序。 – manish
你的建議沒有幫助我。這真是難過;這真是傷心。 – Cloudjumper