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 - 未找到表

Spring Data JPA Native Query - 未注册命名参数

Spring-data-jpa + Hibernate 未创建预期表