【发布时间】:2014-06-28 18:20:34
【问题描述】:
通过 CrudRepository 保存 JPA 实体时遇到问题。它似乎返回了传递给它的原始对象,而没有将对象持久化到数据库中。我知道这不是正确的方法,但出于测试目的,如果我在保存之前放置 TransactionSynchronizationManager 的实例,它似乎正确地持续存在。这让我觉得事务管理器可能有问题?
此外,如果我丢弃存储库并使用实体管理器 (em),我会得到相同的结果,但是如果我调用 em.flush(),我会收到异常“Transactionrequirexception,没有进行中的事务”。
@Transactional
public class UserServiceImpl implements UserService{
@Autowired
private UserRepository userRepository;
@Autowired
private EntityManagerFactory emf;
@Override
@Transactional(readOnly=false)
public User save(User user) {
// EntityManager em = emf.createEntityManager();
//Object persists when adding following line
// TransactionSynchronizationManager.bindResource(emf , new EntityManagerHolder(em));
return userRepository.save(user);
}
}
@ComponentScan(basePackages = {"..."})
@Import(value={DataContextConfig.class,SecurityConfig.class})
public class AppConfig{
}
@Configuration
@ComponentScan(basePackages = {".."})
@Import(DataConfig.class)
public class DataContextConfig {
}
@Configuration
@EnableTransactionManagement(mode=AdviceMode.ASPECTJ)
@EnableJpaRepositories(value={"com.repository"}, entityManagerFactoryRef="entityManagerFactory", transactionManagerRef="transactionManager")
@PropertySource("classpath:data.properties")
public class DataConfig {
...
@Bean
public PlatformTransactionManager transactionManager() {
JpaTransactionManager txManager = new JpaTransactionManager();
txManager.setEntityManagerFactory((EntityManagerFactory) entityManagerFactory());
return txManager;
}
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setJpaVendorAdapter(new HibernateJpaVendorAdapter());
factory.setPackagesToScan("...");
factory.setJpaPropertyMap(jpaProperties());
factory.setDataSource(dbSource());
return factory;
}
@Bean
public DriverManagerDataSource dbSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(environment.getRequiredProperty("jdbc.driverClassName"));
driverManagerDataSource.setUrl(environment.getRequiredProperty("jdbc.url"));
driverManagerDataSource.setUsername(environment.getRequiredProperty("jdbc.username"));
driverManagerDataSource.setPassword(environment.getRequiredProperty("jdbc.password"));
return driverManagerDataSource;
}
}
我上传了一个隔离异常的小项目。压缩并运行 AccountTester.class http://www14.zippyshare.com/v/81636273/file.html
【问题讨论】:
-
您没有在
save之前打开会话。是吗? -
如果放置完整的堆栈跟踪非常有帮助。
-
没有 Stacktrace。失败没有错误
-
我认为您正在尝试
userRepository.save(user);而不打开 Hibernate 会话和 trnsaction 至少这是您收到“No Transaction in Progress”错误的原因。 -
我在 @Config 类中有 @EnableTransactionManagement(mode=AdviceMode.ASPECTJ) 注解。
标签: mysql hibernate spring-mvc jpa-2.0 spring-data