Spring Data Jpa MVC - 数据未插入,但在测试期间持续存在
Posted
技术标签:
【中文标题】Spring Data Jpa MVC - 数据未插入,但在测试期间持续存在【英文标题】:Spring Data Jpa MVC - data not inserting, but persists during Test 【发布时间】:2017-02-27 05:10:33 【问题描述】:我的问题恰恰相反,这里的大多数问题是关于没有插入测试数据,我的问题在测试中持续存在,但在通过控制器调用时不会。
我还是新手,所以可能犯了一些愚蠢的错误。任何帮助表示赞赏!
这是我的设置。
项目一:业务逻辑层:Entities、Services、Repo(Spring Data)、Oracle => bll.jar(测试保存,可以看到log中的insert语句)。文件:AppConfig、HibernateConfig、PersistenceConfig
项目2:Spring MVC 4.3.3,Thymeleaf 3,导入bll.jar,控制器调用BLL Service进行保存。日志中没有插入语句,只需选择语句。 Oracle 序列号正在递增。 save() 后返回的对象显示具有新 Id 的新对象。没有错误。部署在 JBoss Wildfly 中。
到目前为止我尝试了什么
-
认为这一定是提交或刷新问题,在 repo 和服务中添加了 saveAndFlush()。在 BLL 测试中工作,但是当从 MVC 调用时,它会给出错误 没有正在进行的事务。
检查了 MVC save() 并查找 bindingResult 错误,没有
日志似乎显示事务提交,所以不知道为什么它没有持久化
在 Data not inserted to db 之后的控制器 save() 上方添加了 @Transactional(propagation = Propagation.REQUIRED),但没有效果
控制器
@PostMapping(value="/create", params="save") //
public String save(final Cat cat
, final BindingResult bindingResult, final ModelMap model)
if(bindingResult.hasErrors())
logger.info(bindingResult.getAllErrors().toString());
return "cat/create";
Cat updatedCat = catService.save(cat); //saveAndFlush
model.clear();
return "redirect:/cat/create";
编辑 1
注意我的控制器没有@Transaction,只有我的 BLL 服务 方法
另外,我的实体 Cat 有相关实体,但为了简洁我省略了
服务
@Transactional
public Cat save(Cat cat)
return catRepo.save(cat);
相关日志
2017-02-27 08:52:22 DEBUG SQL:109 - 选择 catdts0_.CAT_ID 作为 CAT_ID6_0_0_, .. 来自 CAT_DT catdts0_ 其中 catdts0_.CAT_ID=? 2017-02-27 08:52:22 TRACE BasicBinder:81 - 绑定 参数 [1] 作为 [NUMERIC] - [1] .. 2017-02-27 08:52:22 TRACE BasicExtractor:78 - 提取值 ([CAT_ID6_0_0_] : [NUMERIC]) - [1] 2017-02-27 08:52:22 TRACE BasicExtractor:78 - 提取值 ([ID1_1_0_]:[NUMERIC])-[1] 2017-02-27 08:52:22 调试 EntityManagerFactoryUtils:435 - 关闭 JPA EntityManager 2017-02-27 08:52:22 调试 HibernateTransactionManager:759 - 启动 事务提交 2017-02-27 08:52:22 DEBUG HibernateTransactionManager:580 - 提交 Hibernate 事务 会议 [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@63cd240d 更新=org.hibernate.engine.spi.ExecutableList@6262ff06 删除=org.hibernate.engine.spi.ExecutableList@72d1cb79 orphanRemovals=org.hibernate.engine.spi.ExecutableList@3ff23a08 collectionCreations=org.hibernate.engine.spi.ExecutableList@35158cb7 collectionRemovals=org.hibernate.engine.spi.ExecutableList@407acfdc collectionUpdates=org.hibernate.engine.spi.ExecutableList@3c0c4ea9 collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@1200015a unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] 2017-02-27 08:52:22 DEBUG DataSourceUtils:222 - 重置只读 JDBC 连接标志 [oracle.jdbc.driver.T4CConnection@1dfb6d07] 2017-02-27 08:52:22 调试 HibernateTransactionManager:669 - 关闭 休眠会话 [SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[]];ActionQueue[insertions=org.hibernate.engine.spi.ExecutableList@63cd240d 更新=org.hibernate.engine.spi.ExecutableList@6262ff06 删除=org.hibernate.engine.spi.ExecutableList@72d1cb79 orphanRemovals=org.hibernate.engine.spi.ExecutableList@3ff23a08 collectionCreations=org.hibernate.engine.spi.ExecutableList@35158cb7 collectionRemovals=org.hibernate.engine.spi.ExecutableList@407acfdc collectionUpdates=org.hibernate.engine.spi.ExecutableList@3c0c4ea9 collectionQueuedOps=org.hibernate.engine.spi.ExecutableList@1200015a unresolvedInsertDependencies=UnresolvedEntityInsertActions[]])] 之后 事务 2017-02-27 08:52:22 调试 DispatcherServlet:1251 - 渲染视图 [org.thymeleaf.spring4.view.ThymeleafView@13f5fc54] 名称为“appServlet”的 DispatcherServlet 2017-02-27 08:52:22 调试 ReloadableResourceBundleMessageSource:440 - 找不到属性文件 对于 [/resources/i18n/messages_en_GB] - 既不是普通属性也不是 XML 2017-02-27 08:52:22 调试 ReloadableResourceBundleMessageSource:410 - 重新缓存属性 文件名 [/resources/i18n/messages_en] - 文件未被修改 2017-02-27 08:52:22 调试 DispatcherServlet:1000 - 成功 完成请求
如果我错过了任何重要信息,请告诉我要发布的内容,我仍在摸索中。
【问题讨论】:
您确定您的应用程序配置在哪里设置事务管理 - 可能是您的测试配置? 感谢@Naros,您的评论很有帮助。虽然我只有一个上下文,但结果我的配置搞砸了。发布解决方案,以防对其他人有所帮助。 【参考方案1】:在@Naros 的帮助下回答我自己的问题
原来我的 PersistenceConfig 搞砸了。
持久化配置
public class PersistenceConfig
...
@Bean
public PlatformTransactionManager transactionManager()
EntityManagerFactory factory = entityManagerFactory().getObject();
return new JpaTransactionManager(factory);
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory s)
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(s);
return txManager;
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory()
HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
vendorAdapter.setGenerateDdl(false); //was true
vendorAdapter.setShowSql(true);
LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
factory.setDataSource(dataSource());
factory.setJpaVendorAdapter(vendorAdapter);
factory.setJpaProperties(jpaProperties());
factory.setPackagesToScan("ae.tbits.atn.aiwacore.common.model");
return factory;
@Bean
public DataSource dataSource()
...
return dataSource;
有 2 个 transactionManager(),我怀疑一个在 Test 中被调用,而另一个在我的 web 控制器中被调用。删除以下内容以解决问题。
public HibernateTransactionManager transactionManager(SessionFactory s)
【讨论】:
以上是关于Spring Data Jpa MVC - 数据未插入,但在测试期间持续存在的主要内容,如果未能解决你的问题,请参考以下文章
Spring MVC和Spring Data JPA之获取数据表数据放在List集合,显示在JSP页面
带有spring boot JPA Postgresql的data.sql未加载
混合 Spring MVC + Spring Data Rest 会导致奇怪的 MVC 响应
带有 H2 和 data.sql 的 Spring Boot Data JPA - 未找到表