spring boot + hibernate 在我获得带有命名查询的项目后,我可以使用 entityMnager.persist(item) 吗?

Posted

技术标签:

【中文标题】spring boot + hibernate 在我获得带有命名查询的项目后,我可以使用 entityMnager.persist(item) 吗?【英文标题】:spring boot + hibernate Can I use entityMnager.persist(item) after I get the item with named query? 【发布时间】:2018-06-20 06:28:52 【问题描述】:

我正在使用 Spring Boot 和休眠。我有一个命名查询,我在其中选择一个项目。然后我想设置一些属性,然后制作 entityManager.persist() 或 entityManager.merge()。我可以这样做,否则我的项目实例将在命名查询后不受管理并且持久/合并将失败?

这是我的代码,其中 em.persist() 实际上不起作用:

public String getSMSText(String sourceUrl) 

    Rss rss;
    List urls = em.createNamedQuery("Rss.getFeedByUrl").setParameter("url", sourceUrl).getResultList();
    if (urls.size() != 0) 
        rss = (Rss) urls.get(urls.size() - 1);
        for (Rss.Item item : rss.getChannel().getItems()) 
            try 
                if (Utils.isToday(item.getPubDateAsDate()) && !item.isPushed()) 
                    item.setPushed(true);
                    em.refresh(item);
                    em.persist(item);
                    return item.getTitle() + "." + item.getSummary();
                
             catch (ParseException e) 
                logger.info("Cannot parse pub date", e);
            
        
        logger.info(sourceUrl + " No news for today!");
        return null;
    
    return null;

【问题讨论】:

为什么要对 entityManager 进行持久化?只需使用 Spring data jpa 取回您的数据并保存它,它将为您处理所有底层实体管理器调用。 整个应用程序都是这样制作的,我只是想修复一个错误。这就是为什么。 【参考方案1】:

我的猜测是您对项目的更改不会有任何影响。 只有在查询事务完全关闭时,您才应该更改您的项目。

我认为你有两种方法: 1-仅当您确定选择查询事务已关闭时,才更改您的代码以更新您的实体。 2- 在您的项目上使用 EntityManager.refresh(),在命名查询之后和更改之前并保持它。

【讨论】:

这正是我的问题。我用代码更新了我的问题。即使我将 em.refresh() 放在 em.persist() 之前,它也无法再次工作。您还有什么建议吗? 改变item.setPushed(true)的顺序;和 em.refresh(item)。 em.refresh(item) 将覆盖您对项目所做的每项更改,将状态重置为数据库中的状态。在这种情况下,刷新仅用于确保 namedquery 上的事务已关闭。然后你就可以做出改变并坚持下去。 又没有了.. 数据库中的值仍然不变 奇怪……如果可以的话,试着用两种不同的方法分开选择和更新

以上是关于spring boot + hibernate 在我获得带有命名查询的项目后,我可以使用 entityMnager.persist(item) 吗?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 和 Hibernate:打印/记录 DDL

Hibernate 和 CRUDRepository Spring Boot

Spring Boot / JPA / Hibernate,如何根据 Spring 配置文件切换数据库供应商?

在spring boot集成测试中获取org.hibernate.LazyInitializationException

spring-boot hibernate 关闭验证

在 Spring Boot 中配置 Hibernate 以忽略通过依赖项导入的标有 Entity 的某些类