当前位置: 首页 > 知识库问答 >
问题:

Spring Data Jpa MVC - 数据未插入,但在测试期间持续存在

许俊晤
2023-03-14

我的问题正好相反,这里的大多数问题是测试数据没有被插入,我的问题在测试中持续存在,但在通过控制器调用时不会。

我在这方面还是新手,所以可能犯了一些愚蠢的错误。感谢任何帮助!

这是我的设计

项目1:业务逻辑层:实体、服务、Repo (Spring数据)、Oracle =

项目2:Spring MVC 4.3.3,Thymeleaf 3,import bll.jar,控制器调用BLL服务进行保存。日志中没有插入语句,只需选择语句。甲骨文序列号正在递增。save() 后返回的对象显示具有新 Id 的新对象。无错误。部署在 JBoss Wildfly 中。

我到目前为止试过什么

  1. 认为这一定是提交或刷新问题,在repo和service中添加了saveAndFlush()。在BLL测试中工作,但是当从MVC调用时,它会给出一个错误:没有正在进行的事务
  2. 检查MVC save()并查找bindingResult错误,没有
  3. 日志似乎显示了事务提交,所以不知道为什么它没有持久化。
  4. 在我的控制器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 Service方法

还有我的实体Cat有相关的实体但为了简洁我省略了

服务

@Transactional
public Cat save(Cat cat){
    return catRepo.save(cat);
}

相关日志

2017-02-27 08:52:22调试SQL:109-选择catdts0_。0_ 0_。CAT_ ID=?2017-02-27 08:52:22 TRACE BasicBinder:81-将参数[1]绑定为[NUMERIC]-[1]…2017-02.27 08:22:22跟踪BasicExtractor:78-提取值([CAT_ID6_0_-02-27 08:52:22调试HibernateTransactionManager:759-启动事务提交2017-02-27 08:52:22调试HibernatTransactionManager:580-在会话[SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[];ActionQueue[insertions]上提交Hibernate事务=org.hibernate.engine.spi.ExecutableList@63cd240d更新=org.hibernate.engine.spi.ExecutableList@6262ff06删除=org.hibernate.engine.spi.ExecutableList@72d1cb79孤儿清除=org.hibernate.engine.spi.ExecutableList@3ff23a08收藏创作=org.hibernate.engine.spi.ExecutableList@35158cb7收集清除=org.hibernate.engine.spi.ExecutableList@407acfdc集合更新=org.hibernate.engine.spi.ExecutableList@3c0c4ea9集合队列DOPS=org.hibernate.engine.spi.ExecutableList@1200015aUnsolvedInsertDependencies=UnsolveEntityInsertActions[])]2017-02-27 08:52:22调试数据源实用程序:222-重置JDBC连接的只读标志[oracle.jdbc.driver.T4CConnection@1dfb6d07]2017-02-27 08:52:22调试HibernateTransactionManager:669-关闭Hibernate会话[SessionImpl(PersistenceContext[entityKeys=[],collectionKeys=[];操作队列[insertions]=org.hibernate.engine.spi.ExecutableList@63cd240d更新=org.hibernate.engine.spi.ExecutableList@6262ff06删除=org.hibernate.engine.spi.ExecutableList@72d1cb79孤儿清除=org.hibernate.engine.spi.ExecutableList@3ff23a08收藏创作=org.hibernate.engine.spi.ExecutableList@35158cb7收集清除=org.hibernate.engine.spi.ExecutableList@407acfdc集合更新=org.hibernate.engine.spi.ExecutableList@3c0c4ea9集合队列DOPS=org.hibernate.engine.spi.ExecutableList@1200015aUnsolvedInsertDependencies=UnsolveEntityInsertActions[]])]在事务处理后2017-02-27 08:52:22调试调度器Servlet:1251-渲染视图[org.thymeleaf.spring4.view.ThymeleafView@13f5fc54]在名为“appServlet”的DispatcherServlet中,2017-02-27 08:52:22调试可重新加载的ResourceBundleMessageSource:440-未找到[/resources/i18n/messages_en_GB]的属性文件-既没有普通属性也没有XML 2017-02-27 08:50:22调试可以重新加载的SourceBundleMessagesource:410-重新缓存文件名为[resources/i18n/messages_en]的属性-文件未被修改DEBUG DispatcherServlet:1000-已成功完成请求

如果我错过了任何重要的信息,然后让我知道要发布什么,我仍然在黑暗中摸索。

共有1个答案

朱风史
2023-03-14

在@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(),我怀疑其中一个在测试中调用,而另一个在我的web控制器中调用。删除了以下选项以解决问题。

public HibernateTransactionManager transactionManager(SessionFactory s)
 类似资料:
  • 许多记者将显示测试持续时间,以及标记缓慢的测试,如“spec”记者所示: 要调整被认为“慢”的东西,您可以使用以下slow()方法: describe('something slow', function() { this.slow(10000); it('should take long enough for me to go make a sandwich', function() { /

  • 我的问题是,当我运行测试用例时,数据要插入到应用程序使用的数据库中。我可以不在DB中插入数据来测试它吗。

  • 对代码基址的每一次更改都运行自动化测试 准备好开始在您的开发人员测试活动中大获全胜吗?在本期的 让开发自动化 中,开发自动化专家 Paul Duvall 介绍了几种自动化的开发人员测试,每一次改变源代码都能够运行这些测试。Paul 提供了 Selenium、DbUnit 和 JUnitPerf 测试的例子,即,如果经常 运行这些测试可以帮助您尽早发现应用程序的问题。 在像 Eclipse 那样的

  • 我的观点中有一个功能。py,它将数据插入表1,但表1中的一个字段是另一个表(称为表2)主键的外键。 注:-表2目前为空(无数据)。 现在,我只想检查数据是否正确地插入到表1中,因此,我跳过了Django ORM中的外键,但是我得到了类似“列中的Null值”name“违反了notnull约束”这样的错误 有人能告诉我一个绕过这个(或)任何新方法的方法吗。

  • 问题内容: 我需要计算用户在网站上花费的时间。登出时间与登出时间之间的区别是,给我类似“ X先生花了4个小时43分钟”。因此,为了存储the4小时43分钟,我这样声明: 时间NOT NULL 这是有效的还是更好的存储方式?我需要存储在数据库中,因为我还有其他计算需要将其用于+其他用例。 问题答案: 最好将其存储为整数秒数。 该会是干净和简单-即 正如Tristram所指出的,使用该字段存在局限性

  • 我正在使用RestEasy进行Quarkus和Quarkus测试,并且在每次测试之前设置虚拟数据时遇到了问题。 我正在尝试在调用endpoint之前使用活动记录模式插入用户。在呼叫用户之后。persistAndFlush()(或者简单地调用.persist()),当向User实体请求用户计数时,它会正确地返回数据库中有一条记录。但是,当通过RestEasy调用endpoint时,它会向我提示,没有