java - 无法使用 Hibernate 更新实体

标签 java spring hibernate jpa

我正在将 Hibernate 与 JPA 带注释的实体一起使用,并且我希望更新实体的“raw_text”字段的下一个代码不会更改它。如何实现预期的行为?

@Override
public void updatePageWithText(String pageName, String rawText) {
     Session session = HibernateUtils.getInstance().openSession();
     String hql = "FROM WikiPage M WHERE M.name = :name";
     Query query = session.createQuery(hql);
     query.setParameter("name",pageName);

     WikiPage res = null;
     try {
         res = (WikiPage) query.list().get(0);
         res.setRawText(rawText);
         session.update(res);
         session.flush();
     }
     catch (IndexOutOfBoundsException e) {}
     finally {
         session.close();
     }

}

最佳答案

尝试以下操作:

@Override
public void updatePageWithText(String pageName, String rawText) {
     Session session = HibernateUtils.getInstance().openSession();
     Transaction transaction=session.beginTransaction();
     String hql = "FROM WikiPage M WHERE M.name = :name";
     Query query = session.createQuery(hql);
     query.setParameter("name",pageName);

     WikiPage res = null;
     try {
         res = (WikiPage) query.list().get(0);
         res.setRawText(rawText);
         transaction.commit();
     }
     catch (IndexOutOfBoundsException e) {
         transaction.rollback();
     }
     finally {
         session.close();
     }

}

注意:当您从查询中获取 WikiPage 时,它​​仍然是一个附加实体,因此您不需要触发 session.update()committing 交易 就可以了。

关于java - 无法使用 Hibernate 更新实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26372340/

相关文章:

java - 如何在 spring-social-facebook 中处理 ExpiredAuthorizationException(授权已过期)

java - Eclipse - 运行服务器时模拟全磁盘

java - Spring 启动: @TestPropertySource not loaded from imported configuration

java - 并发 SQS 队列监听器

java - 如何在 Map<String, Embeddable> 上定义 MapKey 列名

hibernate - Hazelcast。二级缓存。找不到SessionFactory异常

java - log4j 在 Catalina.out 和日志文件之间重复日志

java - 使用包装类来实现 Java 中的 typedef 等效项;我必须公开类变量吗?

java - Spring依赖未加载?

java - 使用 jetty :run-exploded 启动时,Wicket 应用程序在启动时抛出异常