当前位置: 首页 > 知识库问答 >
问题:

Hibernate persist()不更新PersistentContext中的模型

韦阳晖
2023-03-14
<persistence-unit name="PersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
        <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
        <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/irm"/>
        <property name="hibernate.connection.username" value="nrossi"/>
        <property name="hibernate.connection.password" value="nicolas"/>
        <property name="hibernate.connection.pool_size" value="5"/>
        <property name="hibernate.show_sql" value="true"/>
        <property name="hibernate.format_sql" value="true"/>
        <property name="hibernate.max_fetch_depth" value="5"/>
        <property name="hibernate.hbm2ddl.auto" value="update"/>
    </properties>
</persistence-unit>
java prettyprint-override">public class PersistenceManager
{
    private static final Logger log = LogManager.getLogger();
    private static final EntityManagerFactory emf;
    private static final ThreadLocal<EntityManager> threadLocal;

    static
    {
        emf = Persistence.createEntityManagerFactory("PersistenceUnit");
        threadLocal = new ThreadLocal<EntityManager>();
    }

    public static EntityManager getEntityManager()
    {
       EntityManager em = threadLocal.get();

       if (em == null)
       {
           em = emf.createEntityManager();
           threadLocal.set(em);
       }
       return em;
    }

    public static <T>T get(Class<T> clazz, Object id)
    {
       return getEntityManager().find(clazz, id);
    }

    public static void save(Object object)
    {
       EntityManager em = getEntityManager();
       EntityTransaction et = em.getTransaction();
       et.begin();
       try
       {
           em.persist(object);
           et.commit();
       }
       catch (Exception e)
       {
           et.rollback();
           throw new RuntimeException("Error saving object", e);
       }
   }
}

顺便说一下,如果我在一个新线程(即incognito窗口)上调用persistenceManager.get(Model.id),它将返回更新后的模型。

我尝试在提交之后添加一个刷新调用em.refresh(model),这是正常的,但我不确定这是否是更新上下文的正确方法。

更新信息我编写了一个简单的JSP页面,只是为了再现该行为。如果我更新实体描述,等待5'并刷新页面,它将返回旧值:

<%@page import="com.identicum.framework.persistence.PersistenceManager"%>
<%@page import="com.identicum.irm.core.model.Entity"%>
<%
    Entity entity = PersistenceManager.get(Entity.class, 1L);
    String value = request.getParameter("entityName");
    if(value != null)
    {
        entity.setDescription(value);
        PersistenceManager.save(entity);
    }
%>
<html>
<body>

Entity description: <b><%= entity.getDescription() %></b>

<br>
<br>

<form method="post">

    Enter new entity description <br>
    <input type="text" name="entityName"/>

    <input type="submit" />

</form>


</body>
</html>

我的PersistenceManager是这个建议的副本。我的应用程序是应用程序管理的EntityManager。我必须在每个请求的生命周期中访问同一个EntityManager。这就是这个方法的原因。这有没有其他的办法来实施呢?

共有1个答案

上官和惬
2023-03-14

首先,persist()用于新实体(数据库上没有记录)。如果要更改对象,必须使用merge()。

但您的问题是您可能处于多线程环境中。因此不能使用ThreadLocal。每个线程都有自己的PersistenceManager。

您使用的是什么应用程序服务器或web容器

 类似资料:
  • 我现在迷路了。

  • 问题内容: 我已经阅读了有关此问题的主题,例如:[\AngularJS中未更新视图,\但我仍然不明白如何在我的简单示例中应用它。 我有这个功能: 当代码中的其他地方更新时(用户单击,交互,发送XHR请求时),它不会更新我的视图。我知道我需要使用$apply做些事情,但我不知道在哪里以及如何做。 有人可以向我解释如何针对这个简单用例解决此问题吗? 我的模型看起来像这样(如果这个问题是必要的)-它里面

  • 问题内容: 我目前正在使用基于Web的Twitter客户端,因此我使用了angular.js,node.js和socket.io。我通过socket.io将新的推文推到我的客户端,服务在其中等待新的推文。当一条新的推文到来时,该服务通过$ broadcast发送事件。 在我的控制器中是一个事件侦听器,其中传入的tweet在单独的函数中进行处理。此功能只是将新的推文推入我的推文范围。 现在,我的问题

  • 我正在与AngularJS项目工作,我有以下问题。我有个密码: form.html: 使用这段代码,someVariable不会显示,但当我将ng-model更改为someVariable.SomeField时,我试图显示它...管用!有人能解释一下为什么吗?

  • 在 redux 基本概念的不可变数据管理 中给出一些示例,演示了不可变的基本更新操作,例如,更新一个对象中一个字段,或者,在数组的末尾增加一个数据。然而,reducer 经常需要综合使用这些基本操作去处理更加复杂的任务。下面是一些你可能必须去实现的常见任务的例子。 更新嵌套的对象 更新嵌套数据的关键是必须适当地复制和更新嵌套的每个级别。这往往是那些学习 redux 一个难以理解的概念,当试图更新嵌

  • 我有一个应用程序在这里呈现在严格模式和非严格模式。在非严格模式下工作正常,模型在onChange中更新,但在严格模式下不工作。有什么想法,为什么以及如何解决这个问题? https://stackblitz.com/edit/react-qvubmx 谢谢