Как обновить базу данных, используя веб-сервис и EclipseLink в качестве поставщика JPA? - PullRequest
1 голос
/ 21 февраля 2012

Я сделал простой веб-сервис, используя EclipseLink в качестве поставщика JPA.Я начинающий, когда прихожу в JPA, поэтому мне интересно, является ли это обычным и наиболее чистым и безопасным способом обновления базы данных:

EntityManager em = emf.createEntityManager();
   if(!em.getTransaction().isActive()){
       em.getTransaction().begin();
   }
   Query query = (Query)em.createNamedQuery("Person.updatePerson");
   query.setParameter("personId", person.getPersonPK().getPersonId())
        .setParameter("personName", name);
   return query.executeUpdate();

Почему мне не нужно использовать em.getTransaction().commit(); после того, как я позвонил em.getTransaction().begin()?query.executeUpdate() похоже обновляет базу данных, а не вызов commit.Почему это так?Что рекомендуется?

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Вам нужно вызвать commit () для подтверждения транзакции. Выполнение запроса не будет зафиксировано.

Какой тип транзакций вы используете? JTA или RESOURCE_LOCAL? Если вы используете JTA, то вы должны использовать JTA для начала транзакций фиксации.

Включите ведение журнала, чтобы получить более подробную информацию.

Обычно обновления в JPA обычно выполняются путем чтения объекта и использования его методов набора, а не выполнения необработанных запросов.

1 голос
/ 22 февраля 2012

Интересный вопрос, я провел некоторое исследование с источником данных не из jta:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit1");
EntityManager em = emf.createEntityManager();
em.getTransaction().begin();
// database: t.name='OLD'
Query query = em.createQuery("UPDATE Test t set t.name = 'NEW'");
query.executeUpdate();
// database: t.name='OLD'
TypedQuery<String> tq 
    = em.createQuery("SELECT t.name from Test t", String.class);
System.out.println(tq.getSingleResult()); 
// output: 'NEW'
// database: t.name='OLD'
em.getTransaction().commit();
// database: t.name='NEW'

Мой подход к объяснению (поправьте меня, если я ошибаюсь):

  1. База данных хранит значение «СТАРЫЙ» до em.getTransaction().commit().
  2. Запрос SELECT возвращает 'NEW' из контекста персистентности
...