Как обновить Entity, полученный с EntityManager.find - PullRequest
0 голосов
/ 24 сентября 2018

После извлечения сущности с помощью 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.

Итак, как мне действительно правильно управлять моей сущностью, чтобы сохранять обновления для сущности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...