本文来自http://fair-jm.iteye.com/ 转截请注明出处
前几天看spring实战(第四版)的spring-data-jpa部分 自己也动手实践了下 发现了一些问题
这边记录一下问题排除后的配置
首先是pom,这本书最不好的一点就是不告诉你要哪些依赖包。
我在动手实践的时候发现hibernate 5.2.1和spring4.2会出现flashMode方法找不到,查了下发现是hibernate在一个版本突然移除了这个方法,结果spring4.2以上跪了,我用的是spring4.3.2但是依赖的最新的spring-data-jpa依旧间接依赖4.2.6的spring-jdbc和spring-orm,在pom里直接依赖4.3.2的以上两个jar后问题排除。
pom(也包含web的 看这本书一路配过来的):
1.8 UTF-8 UTF-8 3.1.0 4.3.2.RELEASE 1.10.2.RELEASE 1.1.7 1.7.21 4.11 3.4 5.1.39 1.0.1.Final 5.2.1.Final 1.0.24 2.8.1 1.8.9 org.springframework spring-webmvc ${spring-framework.version} org.springframework.data spring-data-jpa ${spirng-data-jpa.version} org.springframework spring-orm ${spring-framework.version} javax.servlet javax.servlet-api ${servlet.version} provided org.springframework spring-tx ${spring-framework.version} org.slf4j slf4j-api ${slf4j.version} ch.qos.logback logback-classic ${logback.version} org.hibernate.javax.persistence hibernate-jpa-2.0-api ${hibernate-jpa.version} org.hibernate hibernate-core ${hibernate.version} mysql mysql-connector-java ${mysql.version} com.alibaba druid ${druid.version} org.apache.commons commons-lang3 ${common-lang.version} com.fasterxml.jackson.core jackson-databind ${jackson.version} org.aspectj aspectjrt ${aspectj.version} org.aspectj aspectjweaver ${aspectj.version} org.springframework spring-test ${spring-framework.version} test junit junit ${junit.version} test
db的配置和书上也有少许不同:
@Configuration
//repository所在的package
@EnableJpaRepositories(basePackages = "com.xxx.db")
@EnableTransactionManagement
@Profile("dev")
public class DbDevConfig {
@Bean(initMethod = "init", destroyMethod = "close")
public DataSource dataSource() {
final DruidDataSource source = new DruidDataSource();
source.setUrl("jdbc:mysql://localhost:3306/xxx");
source.setUsername("");
source.setPassword("");
source.setInitialSize(1);
source.setMinIdle(1);
source.setMaxActive(20);
source.setDriverClassName("com.mysql.jdbc.Driver");
return source;
}
@Bean
public JpaVendorAdapter jpaVendorAdapter() {
final HibernateJpaVendorAdapter adapter = new HibernateJpaVendorAdapter();
adapter.setDatabase(Database.MYSQL);
adapter.setShowSql(true);
adapter.setGenerateDdl(false);
adapter.setDatabasePlatform("org.hibernate.dialect.MySQL5Dialect");
return adapter;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
final LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
emfb.setDataSource(dataSource());
emfb.setJpaVendorAdapter(jpaVendorAdapter());
//实体所在的package
emfb.setPackagesToScan("com.xxx.domain");
emfb.afterPropertiesSet();
return emfb;
}
@Bean
public JpaTransactionManager transactionManager() {
return new JpaTransactionManager(entityManagerFactory().getObject());
}
}
书上没有配置emfb的packagesToScan,会导致运行时报persistence.xml找不到的错误,而根据书上说的用containerEntityManager的方式配置是不需要这个xml的。
在使用repository的时候如果用getOne会抛出no session的异常,而用findOne不会.估计又是惰性加载的问题。
估计用spring-boot会省力很多吧,不过排错什么的就更麻烦了。