在我使用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
。
因此,我如何才能真正正确管理我的实体,以持续更新该实体?