如何更新使用EntityManager.find检索到的实体

时间:2018-09-24 05:39:57

标签: jpa

在我使用EntityManager.find检索实体之后,对该实体的更改(通过其设置器)将不会保留。

我正在阅读,应该自动保留对受管实体的更改,并且对通过find检索到的实体进行了管理。但这似乎没有发生。如果我希望更改继续存在,则必须进行查找,进行更改,然后在刚刚通过merge检索到的实体上调用find。这似乎不正确。

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;


public class MyServlet extends HttpServlet
{
    @PersistenceContext
    EntityManager entityManager;

    public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
    {
        MyEntity state = entityManager.find(MyEntity.class, 1);
        state.setX( state.getX()+1 );

        java.io.PrintWriter out = response.getWriter();
        out.println("<html><head><title>Servlet Tester</title></head><body>");
        out.println("Servlet Test Page<br>");
        out.println("(X = " + state.getX() + ")");
        out.println("</body></html>");
    }
}

该实体就是:

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class MyEntity
{
    @Id
    int id;
    int x;

    public int getId()
    {
        return id;
    }

    public void setId(int id)
    {
        this.id = id;
    }

    public int getX()
    {
        return x;
    }

    public void setX(int x)
    {
        this.x = x;
    }
}

在网页的输出中,我可以看到x的值比数据库中x的值大1,因此增量的发生与显示的一样,但是数据库未更新使用新值,并且下次访问该页面时,find检索到的值仍然是旧值。

如果在设置值后添加entityManager.merge(state);,则可以成功保存更新。但是,从我一直在阅读的内容来看,这听起来似乎没有必要,因为我从多个来源了解到,在更新实体时,受管实体应该自动保留这些更改。另外,我已经读到,调用merge的效率要比让容器在应有的情况下提交其排队的更改要低。由于我在find设置后立即更新了实体,因此它不应处于非活动状态。

我如何使实体自动按预期持久保存更新?

我的环境

Hibernate / JBoss

我尝试过的

我尝试使用无状态和有状态会话Bean,希望它们会向容器暗示正在进行某种事务,之后需要清除该事务。

只有当我向有状态会话bean中添加了一个save方法(显式调用entityManager.merge(state);)时,我的有状态会话bean解决方法才起作用,因此与我上面提到的需要致电merge

因此,我如何才能真正正确管理我的实体,以持续更新该实体?

0 个答案:

没有答案