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