После извлечения сущности с помощью 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
на 1 больше, чемзначение x в базе данных, поэтому приращение происходит так, как оно выглядит, но база данных не обновляется новым значением, и при следующем посещении страницы значение, извлеченное find
, остается старым значением.
Если я добавлю entityManager.merge(state);
после установки значения, я смогу успешно сохранить обновления.Однако из того, что я читал, не похоже, что это необходимо, поскольку я прочитал из нескольких источников, что управляемый объект должен сохранять эти изменения автоматически при обновлении объекта.Кроме того, я прочитал, что вызов merge
менее эффективен, чем заставить контейнер фиксировать свои изменения в очереди, когда он должен.Поскольку я обновляю сущность сразу после find
, она не должна быть неактивной.
Как заставить сущность автоматически сохранять обновления, как ожидается?
Моя среда
Hibernate / JBoss
То, что я пробовал
Я пытался использовать сессионные компоненты без сохранения состояния и с состоянием, надеясь, что они намекают контейнеру, что происходит какая-то транзакциячто это нужно было очистить после.
Мой обходной путь сессионного компонента Stateful сработал только тогда, когда я добавил метод save
к сессионному компоненту Stateful, который явно вызвал entityManager.merge(state);
, так что на самом деле он ничем не отличается отто, что я упомянул выше о необходимости вызова merge
.
Итак, как мне действительно правильно управлять моей сущностью, чтобы сохранять обновления для сущности?