【问题标题】:spring boot + hibernate Can I use entityMnager.persist(item) after I get the item with named query?spring boot + hibernate 在我获得带有命名查询的项目后,我可以使用 entityMnager.persist(item) 吗?
【发布时间】: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 取回您的数据并保存它,它将为您处理所有底层实体管理器调用。
  • 整个应用程序都是这样制作的,我只是想修复一个错误。这就是为什么。

标签: spring hibernate named-query


【解决方案1】:

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

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

【讨论】:

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