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

时间:2017-02-27 05:10:34

标签: spring hibernate spring-data-jpa thymeleaf

我的问题完全相反,这里的大多数问题都是未插入测试数据,我的测试数据仍在测试中,但在通过控制器调用时则没有。

我还是新手,所以可能会犯一些愚蠢的错误。任何帮助表示赞赏!

这是我的设置。

项目1 :业务逻辑层:实体,服务,回购(Spring数据),Oracle => bll.jar(测试保存,可以在日志中看到插入语句)。文件:AppConfig,HibernateConfig,PersistenceConfig

项目2 :Spring MVC 4.3.3,Thymeleaf 3,导入bll.jar,控制器调用BLL Service进行保存。日志中没有insert语句,只是select语句。 Oracle序列号递增。 save()之后返回的对象显示具有新Id的新对象。没错。部署在JBoss Wildfly中。

到目前为止我尝试了什么

  1. 认为它必须是提交或刷新问题,在repo和service中添加了saveAndFlush()。在BLL测试中工作,但是从MVC调用它时会出现错误没有正在进行的事务
  2. 检查MVC save()并查找bindingResult错误,没有
  3. 日志似乎显示了交易提交,因此不知道为什么它不会持续
  4. Data not inserted to db之后的控制器save()上方添加了@Transactional(propagation = Propagation.REQUIRED),但没有效果
  5. 控制器

    @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 DEBUG   EntityManagerFactoryUtils:435 - 关闭JPA EntityManager 2017-02-27   08:52:22 DEBUG HibernateTransactionManager:759 - 启动   transaction commit 2017-02-27 08:52:22 DEBUG   HibernateTransactionManager:580 - 提交Hibernate事务   会议   [SessionImpl(PersistenceContext [entityKeys = [],collectionKeys = []]; ActionQueue [insertions=org.hibernate.engine.spi.ExecutableList@63cd240d   updates=org.hibernate.engine.spi.ExecutableList@6262ff06   deletions=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 DEBUG HibernateTransactionManager:669 - 关闭   Hibernate Session   [SessionImpl(PersistenceContext [entityKeys = [],collectionKeys = []]; ActionQueue [insertions=org.hibernate.engine.spi.ExecutableList@63cd240d   updates=org.hibernate.engine.spi.ExecutableList@6262ff06   deletions=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 []])]之后   transaction 2017-02-27 08:52:22 DEBUG DispatcherServlet:1251 -   渲染视图[org.thymeleaf.spring4.view.ThymeleafView@13f5fc54] in   具有名称' appServlet'的DispatcherServlet 2017-02-27 08:52:22 DEBUG   ReloadableResourceBundleMessageSource:440 - 找不到属性文件   for [/ resources / i18n / messages_en_GB] - 既不是普通的属性也不是   XML 2017-02-27 08:52:22 DEBUG   ReloadableResourceBundleMessageSource:410 - 重新缓存属性   filename [/ resources / i18n / messages_en] - 文件尚未修改   2017-02-27 08:52:22 DEBUG DispatcherServlet:1000 - 成功   已完成的请求

    如果我错过了任何重要信息,请告诉我要发布什么,我仍然在黑暗中摸索。

1 个答案:

答案 0 :(得分:1)

在@Naros的帮助下回答我自己的问题

原来我的PersistenceConfig搞砸了。

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)