0

我正在使用弹簧启动和休眠。我有一个命名查询,我在其中选择一个项目。然后我想设置一些属性,然后制作 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;
}
4

1 回答 1

0

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

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

于 2018-06-20T07:07:53.840 回答